にsedはawk、どうやって対応記録の分離機る*ある*複数のライン?
質問
私のログファイル:
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah
Wed Nov 12 blah blah blah blah
Wed Nov 12 blah blah blah blah cat2
more blah blah
even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4
たいへの解析を複数行の応募が猫は見つかりがあります。)何が最善の方法でこれ sed
および/または awk
?
すなわちの気持ちを抱いて欲しいと思い構文解析する
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah cat2
more blah blah
even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4
解決
スペースで始まるすべての行が、(g)awkで簡単に続きます(これは私の記憶によるものです。したがって、いくつかの小さなタイプミスがあり、改行を追加して読みやすくするために):
awk " BEGIN { multiline = 0;}
! /^ / { if (whatever)
{ print; multiline = 1;}
else
multiline = 0;
}
/^ / {if (multiline == 1)
print;
}
"
yourfile
whatever
は、出力が発生するかどうかのチェックです(例:cat)。
他のヒント
と仮定してログファイルに含まれていない制御文字 '\01'
や '\02'
, ことになるの継続線を正確かつ空間の中では、下記されるようになる:
c1=`echo -en '\01'`
c2=`echo -en '\02'`
cat logfile | tr '\n' $c1 | sed "s/$c1 /$c2/g" | sed "s/$c1/\n/g" | grep cat | sed "s/$c2/\n /g"
説明:この置き換え改行コードとアスキー1(制御文字などが表示され、ログファイル)と各シーケンスの"改行コード-空間-空間-空間-スペース"の2アスキー(別制御文字)を指定する。その後、再置換ASCII1改行は、今までの各シーケンスの複数のラインは、旧字交換によるアスキー2.これはgreppedのための猫の2アスキーの再置換の改行コード-空間-空間-空間-空間の組み合わせです。
このようなものですか?
awk 'function print_part() { if(cat) print part } /^ / { part = part "\n" <*>; next } /cat[0-9]$/ { print_part(); part = <*>; cat = 1; next; } { print_part(); cat=0} END { print_part() }' inputfile
/ ^ /
正規表現は継続行を識別します。
/ cat [0-9] $ /
正規表現は、保持する開始行を識別します。
別のアプローチは、 RS
を通常の \ n
以外のものに設定することです。例:
$ awk -v Pre=Wed 'BEGIN {RS = "\\n?\\s*" Pre} /cat.\n?/ {print Pre <*>}' file.log
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah cat2
more blah blah
even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4
所属していません StackOverflow