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
awk
를 pattern
사용하여 검색 하도록 요청한 //
다음 기본적으로 $ 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
, RSTART
및 RLENGTH
에서 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
'programing' 카테고리의 다른 글
특정 Delayed :: Job을 콘솔에서 실행하도록 어떻게 지시합니까? (0) | 2020.08.31 |
---|---|
wpf TextBlock 컨트롤에 새 줄을 넣는 방법은 무엇입니까? (0) | 2020.08.31 |
권한은 시스템 앱에만 부여됩니다. (0) | 2020.08.31 |
Android Studio : 실행 또는 디버그 전에 APK를 자동으로 제거 (또는 adb 명령 실행)하는 방법은 무엇입니까? (0) | 2020.08.31 |
파이썬의 대화식 REPL 모드와 같은 것이 있지만 Java 용입니까? (0) | 2020.08.31 |