0

失敗したイベントを抽出するログ解析スクリプトを作成しようとしています。これらをgrepでプルできます:

$ grep -A5 "FAILED" log.txt

2008-08-19 17:50:07 [7052] [14] DEBUG:      data: 3a 46 41 49 4c 45 44 20 20 65 72 72 3a 30 32 33   :FAILED  err:023
2008-08-19 17:50:07 [7052] [14] DEBUG:      data: 20 74 65 78 74 3a 20 00                            text: .
2008-08-19 17:50:07 [7052] [14] DEBUG:    Octet string dump ends.
2008-08-19 17:50:07 [7052] [14] DEBUG: SMPP PDU dump ends.
2008-08-19 17:50:07 [7052] [14] DEBUG: SMPP[test] handle_pdu, got DLR
2008-08-19 17:50:07 [7052] [14] DEBUG: DLR[internal]: Looking for DLR smsc=test, ts=1158667543, dst=447872123456, type=2
--
2008-08-19 17:50:07 [7052] [8] DEBUG:      data: 3a 46 41 49 4c 45 44 20 20 65 72 72 3a 30 32 34   :FAILED  err:024
2008-08-19 17:50:07 [7052] [8] DEBUG:      data: 20 74 65 78 74 3a 20 00                            text: .
2008-08-19 17:50:07 [7052] [8] DEBUG:    Octet string dump ends.
2008-08-19 17:50:07 [7052] [8] DEBUG: SMPP PDU dump ends.
2008-08-19 17:50:07 [7052] [8] DEBUG: SMPP[test] handle_pdu, got DLR
2008-08-19 17:50:07 [7052] [8] DEBUG: DLR[internal]: Looking for DLR smsc=test, ts=1040097716, dst=447872987654, type=2

私が興味を持っているのは、ブロックごとに、エラーコード(つまり、最初の行の「:FAILEDerr:023」の「023」部分)とdst番号(つまり、「dst =447872123456」の「447872123456」)です。最後の行に。)

誰かがこれらの2つの値を抽出するためのシェルワンライナーを手伝ったり、これにどのようにアプローチすべきかについていくつかのヒントを提供できますか?

4

3 に答える 3

2
grep -A 5 FAILED log.txt | \              # Get FAILED and dst and other lines
    egrep '(FAILED|dst=)' | \             # Just the FAILED/dst lines
    egrep -o "err:[0-9]*|dst=[0-9]*" | \  # Just the err: and dst= phrases
    cut -d':' -f 2 | \                    # Strip "err:" from err: lines
    cut -d '=' -f 2 | \                   # Strip "dst=" from dst= lines
    xargs -n 2                            # Combine pairs of numbers

023 447872123456
024 447872987654

すべてのシェル「ワン」ライナーと同様に、これを行うためのよりエレガントな方法がほぼ確実にあります。ただし、必要なものを取得するには、反復アプローチが非常に成功していると思います。最初は多すぎる情報から始め (grep)、必要な行を絞り込み (grep を使用)、各行の必要な部分を切り取ります (を使用)。切る)。

Linux ツールボックスを使用するにはより多くの行が必要ですが、いくつかのコマンドの基本を知っているだけで、ほとんど何でも実行できます。別の方法として、awk、python、またはその他のスクリプト言語を使用することもできます。これらの言語には、より専門的なプログラミング知識が必要ですが、画面スペースは少なくて済みます。

于 2008-10-30T16:07:52.227 に答える
0

常に同じ数のフィールドがある場合は、

grep -A5 "FAILED" log.txt | awk '$24~/err/ {print $24} $12~/dst/{print $12}' error.txt

err:023
dst=447872123456,
err:024
dst=447872987654,

また、ファイルの残りの部分がどのように見えるかによっては、grep をすべてスキップできる場合があります。

" $24~/err/ {print $24} " の部分は、フィールド番号 24 に err が含まれている場合にフィールド番号 24 を出力するように awk に指示します。~/XXX/ XXX は正規表現です。

于 2008-11-05T18:31:40.900 に答える
0

Ruby での簡単な解決策は次のfilter.rbとおりです。

#! /usr/bin/env ruby
File.read(ARGV.first).scan(/:FAILED\s+err:(\d+).*?, dst=(\d+),/m).each do |err, dst|
  puts "#{err} #{dst}"
end

次のように実行します。

ruby filter.rb my_log_file.txt

そして、あなたは得る:

023 447872123456
024 447872987654
于 2008-10-30T16:11:20.080 に答える