2つのモードの間で行を選択するのに問題があります。

2つのモードの間で行を選択するのに問題があります。

「問題」... コマンドが実際に指示されたとおりに実行しています。

次の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}

    タイトル行が良い場合、フラグをatrue に設定します。

  • /From: [email protected]/{b=1}

    from 行が良好な場合は、フラグをbtrue に設定します。

ノート

  1. シェル変数にすべて大文字を使用するのは悪い習慣です。システムは変数にすべて大文字を使用するため、誤って変数の1つを上書きしたくありません。

  2. cat必要ありません。 awk はファイル名を引数として使用します。

  3. 正規表現では:、スペースは特別ではありません。彼らは逃げる必要はありません。

  4. 電子メールヘッダーでは、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形式に戻すために追加された説明が削除されました。

おすすめ記事