Help us understand the problem. What is going on with this article?

複数ファイルをファイル単位にgrepでフィルタしてwcで行数を数える

More than 1 year has passed since last update.

ただ合計を数えるだけではなくて、ヒストグラムを作りたいときとか、各ファイルの行数を数えたい場合で、かつ、grepでフィルタもしたいとき。たとえば、特定のIPアドレスを除外してアクセスログの行数を数えるとか。

$ find . | xargs wc

すぐに思いつくのはこれです。これでファイルごとの行数が数えられますが、grep条件は加味されていない数値です。

$ find . | xargs grep -v 'xxx' | wc

これにgrepをつけると、フィルタ条件を満たすのですが、数値は合計だけになってしまい、ファイルごとの数値がわかりません。

両立させる方法はこんな感じです。

$ find . | xargs -n 1 sh -c 'echo -n $0; grep -v "xxx" $0 | wc'

xargsの出力をいったんShellに渡すことで、複数のコマンドを並列できるようになります。前半でファイル名を表示して、後半で集計しています。

xargsのnオプションでの1指定は、入力を1個ずつ渡すって宣言です。渡されたものはShellなので$0とかで受け取ります。-I{}でも同じことができます。

echoのnオプションは改行しないってものです。

maru3
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away