「問題」... コマンドが実際に指示されたとおりに実行しています。
次の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モードに設定した2行の間に対応する行があるため、指示どおりに実行されます。
しかし、必要な動作を得るためにどのように調整する必要がありますか?
答え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}
両方のフラグが真で、行に文字列が含まれている場合、その
MYVARIABLE=
行は印刷されます。/Subject: crcheck.sh$/{a=1}
タイトル行が良い場合、フラグを
a
true に設定します。/From: [email protected]/{b=1}
from 行が良好な場合は、フラグを
b
true に設定します。
ノート
シェル変数にすべて大文字を使用するのは悪い習慣です。システムは変数にすべて大文字を使用するため、誤って変数の1つを上書きしたくありません。
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形式に戻すために追加された説明が削除されました。