複数のフィルタを使用して1つずつ印刷する方法は?

複数のフィルタを使用して1つずつ印刷する方法は?

ログのいくつかのパターンを計算する必要があります。

grep aaa ./logs | wc -l

grep bbb ./logs | wc -l

1行ですべての操作を実行する簡単な方法はありますか?良い

cat ./logs | grep -c aaa | grep -c bbb #didn't work.

答え1

次のコマンドを使用できます。

$ grep -oh -e aaa -e bbb ./logs | sort | uniq -c

で以下をman grep読むことができます。

-o、--only-matching一致する行のうち、一致する(空でない)部分のみを印刷します。各部分は別々の出力行に表示されます。

また、次の場合-h

-h、--no-filename出力でファイル名の接頭辞を抑制します。検索するファイルが1つだけ(または標準入力のみ)ある場合、これはデフォルトです。

どちらかを一致させるために使用されます-e。次に、結果を並べ替えて計算するために使用しますuniq

答え2

このフラグを使用できます-e PATTERN。どのように多くの行が含まれているかを計算するにはどちらか一方または両方 aaaまたはbbb:

grep -e aaa -e bbb ./logs | wc -l

aaa合計を別々に計算するには、bbbKhaledのソリューションを確認してください。

答え3

使用awk:

awk '/aaa/ { count["aaa"]++ }
     /bbb/ { count["bbb"]++ }
     END { for (pat in count) print count[pat], pat }'  file

パターンが一致するたびに、一致するパターンに関連する数が更新されます。最後に、カウントリストとそのパターンが出力されます。

答え4

次のコマンドを試してみました。

ウェイン:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

出力

ウェイン:~$for i in aaa bbb; do perl -pne "s/\n/ /g" i.txt| awk -v i="$i" '{print gsub(i,$0)}';echo $i; done| sed "N;s/\n/ /g"| awk '{print $2,$1}'

aaa 1
bbb 2

関連情報