2つの異なる位置で一致する部分文字列を持つ行をカウントするBashコマンド

2つの異なる位置で一致する部分文字列を持つ行をカウントするBashコマンド

デバッグ出力に関する簡単な統計情報を取得しようとしています。

各デバッグ行は次の形式です。(class name)(delimiter 1)(object ID)(delimiter 2)(method name)(delimiter 3)(log message)

どのメソッドから何行が来ているかをカウントしたいです。

基本的に、各行を に削減できる場合(class name)(delimiter)(method name)、ログ ファイルにそれらの削減がいくつ出現するかを知りたいのです。

カウントを行うために Bash で実行できるコマンドは何ですか?

(私は macOS で macports を使用して、デフォルトの BSD スタイルのツールのほとんどを GNU ツールに置き換えてこれを実行しています。)

クラス名を で抽出したりgrep -o -E "^.*(delimiter 1)、メソッド名を で抽出したりgrep -o -E "(delimiter 2).*(delimiter 3)"、両方を で強調表示したりできます。 一致した 2 つだけを出力し、それを で実行してカウントするgrep --color=always -E "^.*(delimiter 1)|(delimiter 2).*(delimiter 3)"方法を探して行き詰まってしまいました。grep| uniq -c

grep1 つの一致または行全体ではなく、各行の両方の一致を印刷する方法はありますか?

答え1

本質的には、

sed -r -n 's/(^.*)(delimiter 1)(.*)(delimiter 2)(.*)(delimiter 3)(.+$)/\1(delimiter)\5/p' <( command that generates debug logs ) | sort | uniq -c | sort -rn

(出典:ここ

  • .*マッチしすぎる可能性があります。sed貪欲で、できるだけ早くできるだけ多くのマッチをしたいので、例えば区切り文字の否定が必要になる場合があります(不便な区切り文字がある場合は複雑になる可能性があります)
  • ^からへの移動は$重要です。式が一致しない場合、行全体がsed一致しない部分が出力に含まれます。
  • 括弧はクラス名とメソッド名の周囲にのみ必要です。他の括弧を削除するには、括弧で囲まれた部分式を順番に参照するため、末尾の数字を変更することになります。(すべてを含めると、出力で何が起こっているかをもっと詳しく表示できるようになりますsed。たとえば、末尾を に変更します/\1(delimiter)\5 -- \1\2\3\4\5\6\7/p)
  • sort連続する同一行のみをカウントし、連続しない同一行は別々にカウントされるuniq -cため、前に実行する必要があります。uniq -c
  • uniq -c重複をドロップするだけでカウントしないsort -uため、置き換えることはできません。sort -u
  • sort質問通りに答えるためには、最後は必要ない
  • はい、正規表現を使用して問題を解決すると、2 つの問題が発生します。

関連情報