"문제"... 명령이 실제로 지시받은 대로 수행하고 있습니다.
다음 mbox 형식 파일이 주어지면:
From: [email protected] #identifies the beginning of the first mail
...
Subject: crcheck.sh #identifies the beginning of the mail body
...
MYVARIABLE="123"
...
From: [email protected] #identifies the beginning of the next mail
...
Subject: crcheck.sh #identifies the beginning of the mail body
...
From: [email protected] #identifies the beginning of next mail
...
Subject: crcheck.sh #identifies the beginning of the mail body
EVILVARIABLE="0.00" #just to mention a value that would cause division by zero errors and crash my main script.
...
From: [email protected] #identifies the beginning of the next mail
...
유효한 제목:과 다음 보낸 사람: 사이의 모든 줄을 선택해야 하지만 보낸 사람 앞의 제목 줄은 $GOODSENDER여야 합니다.
내가 실행 중인 코드:
GOODSUBJECT="crcheck.sh"
GOODSENDER="[email protected]"
cat $MBOX |awk "/Subject\: $GOODSUBJECT$/{a=1}/From\:\ $GOODSENDER /{print;a=0}a"|grep $i\=\"
산출:
MYVARIABLE="123"
EVILVARIABLE="0.00"
예상 출력:
MYVARIABLE="123"
이 명령은 실제로 awk 모드로 설정한 두 줄 사이에 해당 줄이 있기 때문에 지시받은 대로 수행됩니다.
하지만 원하는 동작을 얻으려면 어떻게 조정해야 할까요?
답변1
노력하다:
$ awk "/Subject:/{a=0} /From:/{a=0; b=0} a && b && /MYVARIABLE=/{print} /Subject: crcheck.sh$/{a=1} /From: [email protected]/{b=1}" mbox
MYVARIABLE="123"
어떻게 작동하나요?
/Subject:/{a=0} /From:/{a=0; b=0}
주제에 도달하거나 줄을 벗어나면 모든 플래그를 false로 설정하세요.
a && b && /MYVARIABLE=/{print}
두 플래그가 모두 true이고 행에 string 이 포함되어 있으면
MYVARIABLE=
해당 행이 인쇄됩니다./Subject: crcheck.sh$/{a=1}
제목 줄이 양호하면 플래그를
a
true로 설정합니다./From: [email protected]/{b=1}
from 행이 양호하면 플래그를
b
true로 설정하십시오.
노트
쉘 변수에 모두 대문자를 사용하는 것은 나쁜 습관입니다. 시스템은 변수에 모두 대문자를 사용하므로 실수로 변수 중 하나를 덮어쓰는 것을 원하지 않습니다.
cat
필요하지 않습니다. awk는 파일 이름을 인수로 사용합니다.정규식에서
:
및 공백은 특별하지 않습니다. 그들은 도망칠 필요가 없습니다.이메일 헤더에서는
Subject:
와From:
가 모두 줄의 시작 부분에서 시작되어야 합니다. 모든 더 나은 정규식은/^Subject:/
정규식 기호가 줄의 시작/^From:/
부분에 있을 수 있습니다.^
awk에 변수 전달
$ var=MYVARIABLE
$ awk -v x="$var" '/Subject:/{a=0} /From:/{a=0; b=0} a && b && $0 ~ (x"="){print} /Subject: crcheck.sh$/{a=1} /From: [email protected]/{b=1}' mbox
MYVARIABLE="123"
입력 예
위의 출력은 다음을 입력 파일로 사용하여 생성되었습니다.
$ cat mbox
From: [email protected]
...
Subject: crcheck.sh
...
MYVARIABLE="123"
...
From: [email protected]
...
Subject: crcheck.sh
...
From: [email protected]
...
Subject: crcheck.sh
EVILVARIABLE="0.00"
...
From: [email protected]
...
이것은 질문과 동일합니다. mbox 형식으로 되돌리기 위해 추가된 설명이 제거되었습니다.