1

ログファイルから<次から次へと抽出したいと思います。

$>cat messages.log
2013-03-24 19:32:37.231 <F280 [192.168.178.22]:5000 -- Unknown>, Msg:[Test1]
2013-03-24 19:32:37.547 <F281 [192.168.178.22]:5000 -- Unknown>, Msg:[Test2
Test3
Test4]
2013-03-24 19:32:38.833 <F280 [192.168.178.22]:5000 -- Unknown>, Msg:[Test5]
2013-03-24 19:32:42.222 <F281 [192.168.178.22]:5000 -- Unknown>, Msg:[Test6]
$>sed 's/.*\<\(.*\) \[.*/\1|/g' messages.log
F280|
F281|
Test3
Test4]
F280|
F281|

改行を含む出力を除いて、私が望むものはほとんど得られました。したがって、次の結果が必要です。

F280|F281|F280|F281

正規表現はどのように見えますか?

4

4 に答える 4

2

awkここで使用するこれを行うために、読み取り不能な正規表現を作成しません。

$ awk -F'[< ]' '/^[0-9]+/{s?s=s"|"$4:s=s$4}END{print s}' file
F280|F281|F280|F281
于 2013-03-28T11:02:58.453 に答える
1

これを試して:

sed -n '/</{s/^.*<\([^ ]\+\) .*$/\1|/g;H;${x;s/\n//g;s/| $//;p}}' メッセージ.log
于 2013-03-28T11:01:06.540 に答える
0

grep のみを使用することは必須ですか、それとも他のコマンドも使用できますか? 私はそれを言うだろう

grep "<.* " messages.log | sed  's/.*\<\(.*\) \[.*/\1|/g' | tr -d '\n' | sed 's/.$//'

最初の grep は、目的のパターンに従っていないデータを削除し、その後に sed コマンドを実行します。出力では、誰がどのように見えるべきか

F280|
F281|
F280|
F281|

最後の tr コマンドは、各行の末尾にある改行文字を削除する (つまり、結果を連結する) だけですが、最後の sed は最後のパイプ区切り文字を削除するだけです。

于 2013-03-28T11:06:13.770 に答える
0

そのようなことを試してください(ネストされたグループがあります)、または正規表現で複数行オプションをオンにします:

(^.+<(\w+) .+$)+
于 2013-03-28T11:02:52.030 に答える