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)です。

答え2

編集:ロガーの日付順がわからないようで、「Anywhere」の日付と一致するように項目を変更しました。

あなたの例には複数の項目が表示されないため、次のように仮定します。

2017/04/....
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )

私はあなたにのみ必要だと思います:

dateappearsas="^[0-9][0-9][0-9][0-9]/[0-9][0-9]/"
looking_for="Send Command has completed Successfully"

echo "$LOGGER" \
| egrep -i "${dateappearsas}|${looking_for}" \
|  grep -i -B 1 "${looking_for}" \
| grep -A 1 "$currentdate"
returncode="$?" # in bash, gets the latest command in the preceding pipe, ie the grep's exit code
# the egrep: outputs all dates, and interspered among those some "successfully"
# the 2nd grep: transform those into pairs of date & successfully
# the last grep find only the matching currentdate and the line after it  
if [ "$returncode" = "0" ]
then
   echo "There is a transfer that matches the current date, AND was successful"
else
   echo "There is either no date matching the current date, or it wasn't successfull"
fi

デフォルトでは、egrepは探しているコンテンツとコンテキストを取得します(ここでは日付)。おそらく数行のコンテキストを提供するでしょう。次に、grep -B 1 'what your are looking for'コンテキスト/lookedforペアを一緒にグループ化し(見つかった行と前の日付を一緒に配置)、最後に現在の日付がこのペアにあるかどうかを調べるためにgrepを実行します。

関連情報