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)"表示したりできますgrep --color=always -E "^.*(delimiter 1)|(delimiter 2).*(delimiter 3)"grep私は計算できる2つの一致のみを出力する方法を探していました| uniq -c

grep1つの一致または全行の代わりに1行に2つの一致を印刷する方法はありますか?

ベストアンサー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できるだけ早く一致させようとしているので、区切り文字を否定する必要があるかもしれません(不快な区切り文字があると複雑になる可能性があります)。
  • From toが重要^です$。式が一致しない場合、行全体にsed一致しない部分が出力に含まれます。
  • 括弧はクラス名とメソッド名の周りにのみ必要です。別の名前を削除すると、末尾の数字が変わります。これらの数字は、括弧内のサブ式を順次参照するためです。 (すべて含めると、出力で何が起こっているのかをさらに表示できますsed。たとえば、末尾をに変更するだけです/\1(delimiter)\5 -- \1\2\3\4\5\6\7/p。)
  • sort連続した同じ行を持つ実行のみが計算され、連続していない同じ行は別々に計算されるため、最初に実行する必要がありますuniq -cuniq -c
  • uniq -csort -u重複した項目のみが削除されるため、置き換えることはできずsort -u、計算されません。
  • 最後にsort質問に答える必要はありません。
  • はい、正規表現を使用して1つの問題を解決すると、2つの問題が発生します。

おすすめ記事