awkでパターンマッチ後にマッチが最新であることを確認するために、日付をどのようにマッチしますか? [閉鎖]

awkでパターンマッチ後にマッチが最新であることを確認するために、日付をどのようにマッチしますか? [閉鎖]

デフォルトでは、次のログエントリが表示されます。

*** Send Command has completed Successfully 
Transmitted 508200 bytes in 1 seconds
File Transfer Complete
RemoteTransactionNumber is ***********
************Server: Transfer Mode Set To Send
: *********************************************************50 al**********b:Y 
lf:"*********************************************************" rf:"*************
*(+1)" **************************************41
2017/04/18 13:05:32 About to execute the following Send command:

$ LOGGER変数を定義し、ログに記録されたデータをリモートサーバー上に保存しました。また、$currentdateという変数を作成して保存しました。

currentdate=$(date +"%Y/%m/%d/ %I")

だから私がこの質問をした現在の時間は2017/04/19/01です。

「コマンドの送信が正常に完了しました」と一致させたいとし、次のことを行いました。

ALERT=$(echo "$LOGGER" | awk "/Send Command has completed Successfully/" | grep -A 12 $currentdate)

次に、一致するトランスポートが最新であることを確認するために、現在の日付と時刻(最大1時間)を見つけるために、今後12行をgrepしようとします。これは、このスクリプトが実行されたときに私が興味を持っているすべてだからです。

しかし、最後のawk | grep -A 12 コマンドは機能しません。 awk matchを押した後、日付を見つけて$ currentdateと一致するかどうかを確認する方法についてのアイデアはありますか?これはすべてSSH passコマンドからログのインポートを取得した後にローカル変数(FYI)で実行されるため、この時点では物理ファイルは操作されません。

編集:したがって、ここで何をしたいのかをより明確にするために、現在時刻のすべての一致を報告する必要があります。そして、日付は「Sent Successly」項目の12行以内です。実際、SSHを使用してリモートでサーバーにアクセスし、過去に作成されたログファイルの数を取得しています。次に、各行の最後の100行を取得し、次のように$ Logger変数に保存します。

COMMAND1="find /xxy -mmin -60 | wc -l"
FILENUM=`/xxy-1.05/sshpass  -p$PASS ssh -q -o StrictHostKeyChecking=no -o 
ConnectTimeout=310 $USER@$HOST "$COMMAND1"

COMMAND2="find /xxy -mmin -60 | tail -n $FILENUM | xargs tail -n100"
LOGGER=`/xxy-1.05/sshpass  -p$PASS ssh -q -o StrictHostKeyChecking=no -o 
ConnectTimeout=310 $USER@$HOST "$COMMAND2"

したがって、各ゲームの日付を確認する必要があることを考慮すると、変数にきれいに保存するのが最善の方法であるかどうかはわかりません(awkがこれを行う傾向があり、これが私が最初の選択である理由)

ベストアンサー1

何かがうまくいかない場合は、それを分解し、さまざまな部分がどのような役割を果たしているのかを調べて、何が間違っているのかを調べる必要があります。次のコマンドを試してください。

echo "$LOGGER" | awk "/Send Command has completed Successfully/"

あなたは何を得ますか?ちょうど*** Send Command has completed Successfullyライン。もちろん、日付の検索は機能しません。行に日付が含まれていません。

awkソリューションが必要な場合は、次のようにしてみてください。

echo "$LOGGER" | awk -vc="$currentdate" '
    /Send Command has completed Successfully/ { flag1=1 }
    $0 ~ c { flag2=1 }
END { if (flag1 && flag2) print "Yes"; else print "No" }'

currentdateシェル変数をawk変数としてawkに渡し、その変数c と「Send Command ...」文字列が入力に存在することを確認します。

さて、

  • "$currentdate"妥当な理由がなく、実行している操作がわからない限り、常にシェル変数参照(例:)を引用する必要があります。空白がある限り、grep … $currentdateコマンドは引用符なしでは機能しません。"$currentdate"
  • ログエントリが最新であることを確認したい場合は、コマンド%Iでこのコマンドを使用しないでくださいdate。これは01..12の範囲の時間を返します。だから、

    • ログエントリが午前1時(したがって " 2017/04/18 01:##:## About to execute the following Send command:…")で現在時刻が午後1時の$currentdate場合、変数2017/04/18 01 は12時間前のメッセージが現在のメッセージであることを示します。
    • あなたの例のように、ログエントリが午後1時から(したがって " 2017/04/18 13:05:32 About to execute the following Send command:…")、現在時刻が午後1時の場合、$currentdate変数は(再)である2017/04/18 01 ため、現在のメッセージは現在のメッセージではないことを意味します。

    を使用する必要があり、%H範囲は(00..23)です。

おすすめ記事