programing

awk를 사용하여 일치하는 정규식 패턴을 인쇄하는 방법은 무엇입니까?

nasanasas 2020. 8. 31. 07:54
반응형

awk를 사용하여 일치하는 정규식 패턴을 인쇄하는 방법은 무엇입니까?


를 사용 awk하여 정규식 패턴과 일치하는 파일에서 단어를 찾아야합니다.

나는 단지 패턴과 일치하는 단어를 인쇄 할.

따라서 줄에 있으면 다음이 있습니다.

xxx yyy zzz

그리고 패턴 :

/yyy/

나는 오직 얻고 싶다 :

yyy

편집 : kurumi 덕분에 나는 다음과 같이 쓸 수있었습니다.

awk '{
        for(i=1; i<=NF; i++) {
                tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
                if(tmp) {
                        print $i
                }
        }
}' $1

그리고 이것은 내가 필요한 것입니다 :) 정말 감사합니다!


이것은 아주 기본적인

awk '/pattern/{ print $0 }' file

awkpattern사용하여 검색 하도록 요청한 //다음 기본적으로 $ 0로 표시되는 레코드라고하는 행을 인쇄하십시오. 적어도 문서를 읽으십시오 .

일치하는 단어 만 인쇄하려는 경우.

awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file

GNU의 grep -o동작 을 모방하려는 것 같습니다 . 이렇게하면 각 줄에서 첫 번째 일치 만 원하면됩니다.

awk 'match($0, /regex/) {
    print substr($0, RSTART, RLENGTH)
}
' file

예를 들면 다음과 같습니다.

% awk 'match($0, /a.t/) {
    print substr($0, RSTART, RLENGTH)
}
' /usr/share/dict/words | head
act
act
act
act
aft
ant
apt
art
art
art

에 대한 읽기 match, substr, RSTARTRLENGTH에서 awk수동.

그 후에 같은 줄에서 여러 일치 항목을 처리하기 위해이를 확장 할 수 있습니다. 나는 당신을 위해 모든 숙제를 할 수는 없습니다 :-)


gawk 는 이것을 액션으로 사용하여 모든 라인의 일치하는 부분을 얻을 수 있습니다.

{ if (match($0,/your regexp/,m)) print m[0] }

match (string, regexp [, array]) array가 있으면 지워지고 array의 0 번째 요소가 regexp와 일치하는 문자열의 전체 부분으로 설정됩니다. regexp에 괄호가 포함 된 경우 배열의 정수 인덱싱 요소는 해당 괄호로 묶인 하위 표현식과 일치하는 문자열 부분을 포함하도록 설정됩니다. http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions


Perl이 옵션 인 경우 다음을 시도 할 수 있습니다.

perl -lne 'print $1 if /(regex)/' file

To implement case-insensitive matching, add the i modifier

perl -lne 'print $1 if /(regex)/i' file

To print everything AFTER the match:

perl -lne 'if ($found){print} else{if (/regex(.*)/){print $1; $found++}}' textfile

To print the match and everything after the match:

perl -lne 'if ($found){print} else{if (/(regex.*)/){print $1; $found++}}' textfile

If you are only interested in the last line of input and you expect to find only one match (for example a part of the summary line of a shell command), you can also try this very compact code, adopted from How to print regexp matches using `awk`?:

$ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}'
yyy

Or the more complex version with a partial result:

$ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}'
b

Warning: the awk match() function with three arguments only exists in gawk, not in mawk

Here is another nice solution using a lookbehind regex in grep instead of awk. This solution has lower requirements to your installation:

$ echo "xxx=a yyy=b zzz=c" | grep -Po '(?<=yyy=)[^ ]+'
b

Using sed can also be elegant in this situation. Example (replace line with matched group "yyy" from line):

$ cat testfile
xxx yyy zzz
yyy xxx zzz
$ cat testfile | sed -r 's#^.*(yyy).*$#\1#g'
yyy
yyy

Relevant manual page: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions

참고URL : https://stackoverflow.com/questions/5536018/how-to-print-matched-regex-pattern-using-awk

반응형