さまざまな形式の多数の行を含む非常に大きなログファイルを処理する必要があります。
私の目標は、同じ開始パターン(例: "^2011-02-21.*MyKeyword.*Error")を使用して一意の行項目を抽出し、各行パターンのサンプルリストを効果的に取得してパターンを識別することです。 。
私はこれまでいくつかのパターンを知っているので、ファイルを手動でナビゲートすることは確かにオプションではありません。
既知のパターンに加えて、自動的に抽出したい未知のパターンがたくさんあります。
これを行う最良の方法は何ですか?私は正規表現についてたくさん知っていますが、awk / sedについてはまだ多くのことをしていません。
答え1
私が正しく理解したら、パターンが複数あり、各パターンの一致するものを抽出したいと思います。次のawkスクリプトはこの問題を解決するはずです。指定されたパターンの最初の出現を印刷し、その後の出現が印刷されないようにマークされたパターンを記録します。
awk '
/^2011-02-21.*MyKeyword.*Error/ {
if (!seen["^2011-02-21.*MyKeyword.*Error"]++) print;
next;
}
1 {if (!seen[""]++) print} # also print the first line that matches no pattern
'
MyKeyword.*Error
これは1日に1行を維持するバリアントです。
awk '
/^[0-9]{4}-[0-9]{2}-[0-9]{2}.*MyKeyword.*Error/ {
if (!seen[substr($0,10) "MyKeyword.*Error"]++) print;
next;
}
'
答え2
行をグループ化したい場合は明確ではありません。不明な出力モードまたは既知のパターンの不明なキーワード。
最初の場合、次のログがある場合:
[2010-04-02 12:00:00] Error: BaseController Something went wrong
2010-04-02 12:01:00 Warning - Something happened
UserController (2010-04-02 12:02:00) failed with exit status: 1
[2010-04-02 12:03:00] Error: BaseController Something went wrong
[2010-04-02 12:04:00] Error: BaseController Something went wrong
2010-04-02 12:04:01 Warning - Something else happened
UserController (2010-04-02 12:05:00) failed with exit status: 2
UserController (2010-04-02 12:06:00) failed with exit status: 10
tr
その後、およびsort
/またはuniq
パターンをナビゲートするために使用できます。
$ tr '[:alpha:]' x < file.log | tr '[:digit:]' d | sort -u
dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxxxxxx
dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxx xxxxxxxx
[dddd-dd-dd dd:dd:dd] xxxxx: xxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxx
xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: d
xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: dd
または発生回数を計算したい場合:
$ tr '[:alpha:]' x < file.log | tr '[:digit:]' d | sort | uniq -c
1
1 dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxxxxxx
1 dddd-dd-dd dd:dd:dd xxxxxxx - xxxxxxxxx xxxx xxxxxxxx
3 [dddd-dd-dd dd:dd:dd] xxxxx: xxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxx
2 xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: d
1 xxxxxxxxxxxxxx (dddd-dd-dd dd:dd:dd) xxxxxx xxxx xxxx xxxxxx: dd
しかし、パターンが常に同じ場合、例えば私のキーワード常に同じ場所にあります(たとえば[2010-04-02 12:00:00] Error: BaseController Something went wrong
、)、その場所にどの文字列があるかを確認するには、次のようにします。
$ awk '{a[$3]++} END {for (i in a) {printf("%4d %s\n", a[i], i) } }' file.log
これはあなたに次のことを与えるでしょう
3 Error
1 Info
2 Warning