awk를 사용하여 단일 파일에서 여러 정규식 일치

awk를 사용하여 단일 파일에서 여러 정규식 일치

쉘 스크립트를 사용하여 HTML 파일을 구문 분석하려고 합니다.

name=, age=, class=, 4개의 서로 다른 정규식을 캡처해야 합니다 marks=.

사용

grep "name=\|age=\|class=\|marks=" student.txt

필요한 행을 얻을 수 있지만 일치하는 행 외에도 각 게임의 점수가 포함된 두 번째 행도 인쇄해야 합니다.

참고 질문:일치하는 줄과 일치하는 줄 내의 n번째 줄을 인쇄합니다..

코드를 다음과 같이 수정했습니다.

awk '/name=\|age=\|class=\|marks=/{nr[NR]; nr[NR+2]}; NR in nr' student.txt

그러나 이것은 작동하지 않는 것 같습니다. 동일한 명령으로 여러 정규식을 검색하는 방법은 무엇입니까 awk?

답변1

다음을 사용해 보세요:

awk '/foo/||/bar/' Input.txt

답변2

awk정규식은 확장 정규식이고 grep그렇지 않은 정규식은 -E기본 정규식입니다. 확장된 정규식을 사용하십시오:

awk '/name=|age=|class=|marks=/{nr[NR]; nr[NR+2]}; NR in nr'

표준 기본 정규식은아니요대체 연산자가 있으므로

grep 'a\|b'

일반적으로 모든 경우에 작동하지는 않습니다 grep(GNU와 같은 일부는 grep확장 기능으로 지원하지만).

grep -E 'a|b'
grep -e a -e b
grep 'a
b'

어쨌든 작동할 것입니다 grep.

답변3

grep 사용

컨텍스트 전환 후에 grep()을 사용 하고 일치 후 첫 번째 줄을 가져오도록 -A지정 하면 어떻게 됩니까?1

$ grep -E -A 1 "name=|age=|class=|marks=" student.txt

샘플 파일.

$ cat student.txt 
name=
1st line after name
2nd line after name
age=
1st line after age
2nd line after age
class=
1st line after class
2nd line after class
marks=
1st line after marks
2nd line after marks

그런 다음 위 명령을 실행하면 다음과 같습니다.

$ grep -E -A 1 "name=|age=|class=|marks=" student.txt
name=
1st line after name
--
age=
1st line after age
--
class=
1st line after class
--
marks=
1st line after marks

awk를 사용하세요

@RahulPatil이 제안한 대로 다음 구성을 사용하세요 awk.

'/string1/||/string2/||...'

이와 같은 것이 귀하의 필요에 맞는 트릭을 수행할 것입니다.

$ awk '
  /name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr
' student.txt 

$ awk '
  /name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr
' student.txt
name=
1st line after name
age=
1st line after age
class=
1st line after class
marks=
1st line after marks

답변4

grep에 "-A" 플래그를 사용해 보셨나요? 일치 후 후행 컨텍스트 줄을 인쇄합니다. 예: grep -A1 foo file.txt단어가 포함된 행을 일치시키고 인쇄합니다.부자바로 다음 줄을 인쇄합니다.

관련 정보