次のステートメントの多くのインスタンスを含むログファイルがあります。
14 Aug 19 16:30:11.506: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
20 Aug 19 16:30:12.439: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
21 ###############################################################################
IDLE
さっき#########..
お話した内容を置き換えEND
て別の状況を維持したいと思いますIDLE
。
どのように実装できますか?
編集:実際のファイルと異なる場合があります。この質問に対する答えは目標には及ばない。詳細な抜粋と要件は次のとおりです。
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
上記のインスタンスで操作を実行した後、結果は次のようになります。 (IDLE
前####
の行はに変更されますEND
。このタイプのイベントインスタンスがたくさんあることに注意してください。実際に必要なのは、RINGING
2つのインスタンス間の時間差を見つけることです。IDLE - aka END)
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|END|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
答え1
修正する:ex
コマンドモードは、一致する最初の行にのみ有効です。 Perlの例では、すべての行をパターンに置き換えますが、元のファイルを編集せずに出力のみを提供するため、出力を新しいファイルにリダイレクトする必要があります。 YOUR-LOGFILEは、変更したいファイルの場所に置き換える必要があります。
perl -0pe 's/IDLE(.*\n.*###)/END\1/g' ログファイル > 新しいファイル
これにより、パターンを含む行の上の行が変わり、終了します。
ex -s +'/######/-1 s/idle/end/ x' ログファイル
答え2
努力する:
$ awk '!/^#+$/ {print l; l=$0; next} {gsub("IDLE","END",l); print l; l=$0} END {print $0}' < log.txt
これは作る:
Aug 19 16:30:11.506: <DATA> |POS|IDLE|1|01131844090|5950|$hostIp|$size |$data
Aug 19 16:30:12.439: <DATA> |POS|END|1|01131844090|5950|$hostIp|$size |$data
###############################################################################
答え3
sed '$!N;/###$/s/IDLE/END/;P;D
' <<\DATA
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
DATA
sed
これは、通常の1行バッファを2行バッファに拡張します。最後の行を除く各行で、次の入力行をパターン空間に追加します。 2行のバッファが文字列で終わる場合、 ###
最初の文字IDLE
列はEND
。その後、P
バッファに最初に表示される改行文字を印刷し、D
残りの部分で再開する前に同じ内容を削除します。これは、問題のための非常にシンプルでポータブルで非常に高速なソリューションです。
出力
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|END|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
ファイルをその場で編集するには、次のようにします。
sed '$!N;/###$/s/IDLE/END/;P;D
' <<FILE >file
$(cat file)
FILE
あるいは、GNUを使用すると、sed
少なくとも次のようにすることができます。
sed -i '$!N;/###$/s/IDLE/END/;P;D' file