5

以下のログを短い形式で含むファイルを要約するスクリプトを作成しようとしています。

ログのスニペット:

$ cat input.txt
ffffff     1301 2012-08-29T03:13:33 clr         crit
Some serious problem
cccc                            dddddd        eeeeee
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Some serious problem in system.

ffffff     1302 2012-08-29T03:13:33 set         min
Some serious problem
cccc                            dddddd        eeeeee
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Some minor problem in system. 

望ましい出力:

2012-08-29T03:13:33 clr crit Some serious problem in system.
2012-08-29T03:13:33 set min Some minor problem in system. 

以下のアプローチを試しました:

$ cat input.txt | grep -iE "set|upd|clr" | awk '{print $3,$4,$5}' >file1
12-08-29T03:13:33  clr crit
12-08-29T03:13:33  set min

以下のコマンドは、パターン「T」から 5 行目を表示しますが、問題は目的のテキスト行にあります。場合によっては 5 行目にあり、場合によっては 4 行目にあります。

$ awk '/T/ { show[NR+4]++  } show[NR]' input.txt >file2

$ paste file1 file2 

クエリ:

場合によっては 5 行目にあり、場合によっては 4 行目にあります。正確なテキストを確実に見つけるにはどうすればよいですか。可能な場合はお知らせください。

4

3 に答える 3

3

これを解決する正しい方法は、awks Record Separator を null 文字列に設定して、入力レコードが空白行で区切られていることを awk が認識できるようにすることです。

$ awk -v RS= -F'\n' '{split($1,a,/ +/); print a[3],a[4],a[5],$NF}' file
2012-08-29T03:13:33 clr crit Some serious problem in system.
2012-08-29T03:13:33 set min Some minor problem in system.

そうすれば、将来レコードの他のセクションを印刷したり、レコード数のカウントを印刷したり、いくつかのキーフィールドなどに基づいて一意のレコードのみを印刷したりする場合、 awk は知っていて、記録。

于 2013-09-25T12:51:51.713 に答える
1

この awk 1 行はより堅牢なはずです。

awk '$3 ~ /[0-9]+-[0-9]+-/{printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5; 
     for(i=0; i<5; i++) getline; print OFS $0}' input.txt

2012-08-29T03:13:33 clr crit Some serious problem in system.
2012-08-29T03:13:33 set min Some minor problem in system.

更新:: getline を使用しないソリューション:

awk '$3 ~ /[0-9]+-[0-9]+-/{s=NR; printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5}
     NR==s+5{print OFS $0}' input.txt
于 2013-09-25T10:57:51.137 に答える