awk システムで bash コマンドを一度だけ実行します。

awk システムで bash コマンドを一度だけ実行します。

tail -F を使用して悪天候アラームサーバーのログファイルを監視し、awk を使用してアラーム条件が満たされた場合にコマンドをフィルタリングして実行します。 bashコマンド(警告LEDをトリガーするためにPiに送信されたsshコマンド)は、一致ごとに1回ではなく、システムで1回だけ実行できます。一致する各行に対してシステムコマンドが一度実行されることを除いて、すべてがうまく機能します。これが私が今まで持っているものです:

tail -F /home/user/test.txt | stdbuf -oL awk '/ZZZ029/{getline; if (/SV.W/) print system("command")}'

現在の出力(行数は異なる場合があります):

/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/
/O.CON.KFFC.SV.W.0021.000000T0000Z-190315T0015Z/
/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/
/O.CON.KFFC.SV.W.0021.000000T0000Z-190315T0015Z/
/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/
/O.CON.KFFC.SV.W.0021.000000T0000Z-190315T0015Z/

予想出力:

/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/

1行の出力のみが必要なため、システムコマンドは一度だけ実行されます。あるいは、出力ラインの数に関係なく、コマンドを一度だけ実行する方法です。

ベストアンサー1

From current output what you provided from my understanding you want to remove duplicates

pipeline_previous_command|awk '{if(!seen[$1]++)print $1}'

/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/
/O.CON.KFFC.SV.W.0021.000000T0000Z-190315T0015Z/

上記の出力のような出力が欲しいとします。

raveen:~$ pipeline_previous_command |  awk '/W.0028/{if(!seen[$1]++)print $1}'

/O.NEW.KBMX.SV.W.0028.190314T2350Z-190315T0030Z/

おすすめ記事