awk가 이 두 작업을 수행하는 이유는 무엇입니까?

awk가 이 두 작업을 수행하는 이유는 무엇입니까?

명령을 실행할 때:

awk '/from/ {print $7} /to/ { print $7}' erroMuitoDoido.txt

파일은 다음과 같습니다

May 19 04:44:43 server postfix/smtpd[32595]: CDAB515013: client=servidor.dominio.com.br[10.10.10.44]
May 19 04:44:43 server postfix/cleanup[18651]: CDAB515013: message-id=<[email protected]>
May 19 04:44:43 server postfix/qmgr[16684]: CDAB515013: [email protected], size=19590, nrcpt=1 (queue active)
May 19 04:44:50 server postfix/pipe[32596]: CDAB515013: [email protected], relay=dovecot, delay=6.2, delays=0.02/6/0/0.14, dsn=2.0.0, status=sent (delivered via dovecot service)
May 19 04:44:50 server postfix/qmgr[16684]: CDAB515013: removed

출력은 다음과 같습니다

[email protected],
[email protected],
[email protected],

문제는 "라는 라인이다.[이메일 보호됨],"가 두 번 나타납니다. 이 문제를 어떻게 해결할 수 있나요?

AWK 버전: GNU Awk 4.0.0
운영 체제: Debian 6, OpenSuse 12.1, CentOS 6.2

답변1

$ awk '/from=/ {print $7} /to=/ { print $7}' erroMuitoDoido.txt

왜냐하면:

[email protected],
              ^^
              ^^

답변2

입력이 해당 패턴과 일치하면 모든 작업이 순차적으로 수행됩니다. 입력이 두 패턴 모두와 일치하면 두 작업이 모두 수행됩니다.

하나의 패턴과 일치하는지 또는 다른 패턴과 일치하는지에 관계없이 필드를 인쇄하려면 다음 두 가지를 결합하십시오.

awk '/from/ || /to/ { print $7}' erroMuitoDoido.txt

여기서 두 표현식을 하나의 정규식 일치로 결합할 수 있습니다.

awk '/from|to/ { print $7}' erroMuitoDoido.txt

from현재 수행 중인 작업에 대해 일치 항목을 필드 시작 부분에 고정해야 합니다 . 하위 문자열 또는 다음이 포함된 이메일 주소를 일치시키고 싶지 않을 수도 있기 때문입니다 to.

awk '$7 ~ /^(from|to)=/ { print $7}' erroMuitoDoido.txt

다른 처리를 원하는 경우, 보다 정확한 일치를 통해 패턴이 겹치지 않으므로 별도의 작업을 사용할 수 있습니다.

awk '$7 ~ /^from=/ { … } $7 ~ /^to=/ { … }' erroMuitoDoido.txt

더 이상 처리를 중지하고 다음 줄로 이동하려면 키워드를 사용할 수 있습니다 next.

관련 정보