![awk를 사용하여 단일 파일에서 여러 정규식 일치](https://linux55.com/image/45954/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8B%A8%EC%9D%BC%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EC%A0%95%EA%B7%9C%EC%8B%9D%20%EC%9D%BC%EC%B9%98.png)
쉘 스크립트를 사용하여 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
단어가 포함된 행을 일치시키고 인쇄합니다.부자바로 다음 줄을 인쇄합니다.