Linuxで特定の形式をgrepして発生回数を取得する方法

Linuxで特定の形式をgrepして発生回数を取得する方法

次の行を含むログファイルがあります。

2022-05-21 23:59:59,2406,842,[75000000,074],passed
2022-05-21 23:59:59,2410,841,[750000,076],passed
2022-05-21 23:59:59,3002,892,[700000,78],passed

grepする他の方法はありますか7570以下を試しましたが、動作しません。私にもこのようなイベントが必要だ。

cat 20220521log|grep -E "2022-05-21 23|75" -C

修正する:

上記のように、各ログには異なるタイムスタンプと数字が含まれています。私のパターンに応じて、各ファイルにいくつかのエントリがあることを確認する必要があります。 20220521 ログファイルを例に挙げます。数値フィールドで始まる行数を確認する必要があります75。その他すべてのフィールドは以前と同じです。

2022-05-21 23:59:59,2406,842,[75000000,074],passed //should take as one occurence
2022-05-21 23:59:59,2406,842,[00000000,074],passed //should not consider
2022-05-21 23:59:59,2406,842,[754324000,074],passed //should take as one occurence.

答え1

このために複数のプログラムを呼び出す必要はありません。 Perl(およびおそらくawk / python / ...)がすべてのことを行うことができます。

perl -a -F'' -e 'BEGIN { print "status  count\n" } $a = join "",(@F[30,31]); next unless ($a == 70 or $a == 75); $b{$a}++; END { for (keys %b) { print "$_      $b{$_}\n" } }' < 705361.log

705361質問のID。コマンドをテストするためにファイル/ディレクトリを作成する前にここに置くときに使用するルールです。)

答え2

数ですべてのアイテムをインポートする必要がある場合は、単に次のことを実行できます。

grep '^2022-05-21.*\[75' logfilename | tee >(wc -l)

2022-05-21これにより、で始まる[75すべての行が印刷されます。 (各行には括弧で始まる数値フィールドのみがあるとします。)その後、出力の最後の行に数を印刷します(teeにwcとして計算する出力のコピーを送信するようにしてください)。

各日付に固有のファイルがある場合は省略できます^2022-05-21.*。行数以外の数だけが必要な場合は、そのファイルを削除し(小文字のc)| tee >(wc -l)だけを使用してください。grep -c

答え3

おそらくあなたは次のようなものが欲しいでしょう:

<your-file grep -Po '^\d\d\d\d-\d\d-\d\d \d\d(?=:\d\d:\d\d,\d+,\d+,\[75)' |
  uniq -c

4番目のフィールドは、1時間ごとに始まる行数に使用されます[75(行が時系列であると仮定)。

答え4

パスワード:

cat 20220521log | (echo "status count" ; awk -F "," '{list[substr($4,2,2)]++} END {for(i in list){print i, list[i]}}') | column -nt

結果:

結果

関連情報