grepがカウントされるときとされないとき

grepがカウントされるときとされないとき

のマニュアルページには次のようにgrep書かれています:

-c, --count: 通常の出力を抑制し、代わりに各入力ファイルの一致する行の数を出力します。

与えられた:

# grep -R -c sleeping /proc/*/status

カウントではなくリストを取得します (次の場合と同様)。

# grep -R sleeping /proc/*/status | wc -l

はどうなっているのでしょうかgrep -c? カウントを取得せずに代わりに を使用するには、(上記のコマンドで) 何をすればよいのでしょうかwc -l?

答え1

grep -c各入力ファイルごとに一致する行の数を個別に表示します (これは実際にマニュアルからの引用で述べられていることです):

$ grep -c user chmod.1 chown.1 
chmod.1:20
chown.1:5

つまり、chmod.120 個の一致があり、chown.15 個あります。

ここでのファイル名のリスト表示は通常の grep と同様に機能します。つまり、入力ファイルが複数ある場合はファイル名がリストされますが、入力ファイルが 1 つしかない場合はリストされません。少なくとも GNU grep では、これは および-Hフラグで変更できます-h

それで、

$ grep -c user chmod.1
20
$ grep -cH user chmod.1
chmod.1:20

答え2

合計数を求めるには、ファイルごとの数を報告しない、catそれほど役に立たない使用法を使用します。grep

-bash-4.2$ cat /proc/*/status | grep -c sleeping
171
-bash-4.2$ grep sleeping /proc/*/status | wc -l
171
-bash-4.2$ 

関連情報