2009-07-05 3 views
3

を出力ファイル名と内容-grepするを見つけるシェルスクリプトを書きます私はこの単純なスクリプトを使用することができます「ABC」を含むすべてのPHPファイルを表示するには1行で

find . -name "*php" -exec grep abc {} \; 

は、私は今、希望すると同時に両方を行うものですが、同じ行に:私は、結果として、代わりにファイル名の内容の一部を抽出します。

期待出力

path1/filename1: lorem abc ipsum 
path2/filename2: ipsum abc lorem 
path3/filename3: non abc quod 

grep abc *のような多かれ少なかれがありません。

編集:私はこれを単純なシェルスクリプトとして使いたいと思います。出力が1行であれば大丈夫ですので、さらにグレープすることが可能です。しかし、スクリプトが1行だけである必要はありません。私はそれをbashスクリプトファイルに入れています。

編集2:後で私は "ack"を見つけました。これはすばらしいツールで、grepの代わりにこれを使用します。それはこれ以上すべてを行います。 http://betterthangrep.com/あなたは-Hスイッチ(man grep)を使用し、望ましい結果

答えて

7

を取得するためにack --php --nogroup abcを記述します。xargsを使用して

find . -name "*php" -exec grep -H abc {} \; 

代替を(今-Hスイッチが必要とされていない、少なくともgrepのバージョンのために私が持っていますここで):

find . -name "*php" -print | xargs grep abc 

上記の第2のコマンドは、findが単一のファイル名(すなわち、1つのファイル名)しか返さないと考えられる場合、-Hを使用すべきである。 PHPファイルが1つだけの場合)。 orsogufoのコメントw.r.t. -print0も組み込まれ、コマンドは次のようになる。

find . -name "*php" -print0 | xargs -0 grep -H abc 

編集2: A(以上)POSIX/dev/nullの使用を通じて-Hスイッチ回避Jonathan Leffler、によって提案されているように準拠バージョン:

find . -name "*php" -print0 | xargs -0 grep abc /dev/null 

:からの引用

SVR4のfindユーティリティの機能は -exec主の+ターミネータた:-print0は非標準であることをopengroup.org manual on findヒント。この は、 文字(特にs)を含むファイル名を がxargsにパイプされた場合に生じる の問題なしで一緒にグループ化されます( )。他の 実装では、この問題を回避するために、他の方法を追加しました。特に、ヌルバイトターミネータでファイル名を書き込んだ -print0プライマリです。 ここでは としましたが採用されていません。 ヌルターミネータを使用すると、 ユーティリティは、 のfindの-print0出力に、新しい オプションを追加してヌルターミネータを解析する必要がありました( )。

+0

(スクリプトは無関係が、日々shell'ingに有用)、その場合には、それキャプチャとともにファイル名を出力します。私はそれが標準的な振る舞いだと思っていますし、あなたとは違ったgrepsでも動くはずです。 'find ... -print0'を使い、出力を 'xargs -0'にパイプして、0の区切り文字を使用し、あなたのコマンドが厄介なファイル名(例えば空白を含む)で動作するようにするほうが、 。 –

+0

ご意見ありがとうございます。私は答えを更新しました。 – Stephan202

+0

grepに渡される1つのファイルの可能性に対処するもう1つの方法は、コマンドに/ dev/nullを追加することです。grepは常に少なくとも2つのファイルを検索します。 grepの '-H'オプションは、POSIX仕様の一部ではありません。有用なGNU拡張です。 –

2

あなたが再帰的に検索する必要がない場合は、あなたに必要な出力を提供します..which ..

grep -H abc *.php 

を行うことができます。

grep abc *.php 

あなたは-Rフラグを使用して再帰的にgrepすることができますが、.phpファイルにそれをできない制限だ:-Hは、あなたがこれを省略することができるように、デフォルトの動作(少なくともグレップのOS Xバージョンで)です。

grep -R abc * 

これもやはり同じ出力が得られます。

私は、これは正確にあなたの質問に答えていない、それだけで...代替知っている...上記はちょうどそうfind/-exec/grep/xargs組み合わせよりも覚えやすいです、単一のフラグでgrepしています! grepのコマンドラインで複数のファイルを受信して​​いるので-Hをxargsので必要とされない

1
find /path -type f -name "*.php" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /time/){ 
      print $0":"line 
      #do some other things here 
     } 
    }  
}' 
関連する問題