3

「abc」を含むすべての php ファイルを表示するには、次の簡単なスクリプトを使用できます。

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

-l を省略すると、結果としてファイル名の代わりにコンテンツの一部が抽出されます。

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

私が今欲しいのは、両方を同時に行うバージョンですが、同じライン上にあります。

期待される出力:

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

多かれ少なかれgrep abc *そうです。

編集:これを単純なシェルスクリプトとして使用したい。出力が 1 行に収まっていれば素晴らしいので、さらに grep を実行できます。ただし、スクリプトが 1 行だけである必要はありません。とにかく、bash スクリプト ファイルに入れています。

編集 2:後で「ack」を見つけました。これは優れたツールであり、今ではほとんどの場合、grep の代わりにこれを使用しています。これ以上のことをすべて行います。http://betterthangrep.com/ack --php --nogroup abc目的の結果を得るために書きます

4

3 に答える 3

7

-Hスイッチ ( man grep)を使用します。

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

別の使用法xargs-H少なくともgrep私がここに持っているバージョンでは、スイッチは必要ありません):

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

編集: orsogufogrepで指摘されている の動作の結果として、上記の 2 番目のコマンドは、単一のファイル名のみを返す可能性がある場合 (つまり、PHP ファイルが 1 つしかない場合) を使用する必要があります。orsogufo のコメント wrtも組み込むと、コマンドは次のようになります。-Hfind-print0

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

編集 2: Jonathan Lefflerによって提案された (more 1 ) POSIX準拠バージョン。/dev/null-H

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

1 :非標準のヒントに関する opengroup.org マニュアルfindからの引用:-print0

SVR4 の find ユーティリティの機能の 1 つに、-exec プライマリの + ターミネータがありました。これにより、特殊文字 (特に s) を含むファイル名をグループ化することができ、そのようなファイル名が xargs にパイプされた場合に発生する問題が発生しませんでした。他の実装では、この問題を回避する別の方法が追加されています。特に -print0 プライマリは、ヌル バイト ターミネータを使用してファイル名を書き込みます。これはここで考慮されましたが、採用されませんでした。 ヌル ターミネータを使用すると、find の -print0 出力を処理しようとするユーティリティは、現在読み取っているヌル ターミネータを解析する新しいオプションを追加する必要がありました。

于 2009-07-05T15:37:35.230 に答える
2

再帰的に検索する必要がない場合は、単に行うことができます..

grep -H abc *.php

..これにより、目的の出力が得られます。-Hがデフォルトの動作であるため (少なくとも OS X バージョンの grep では)、これを省略できます。

grep abc *.php

フラグを使用して再帰的に grep することはできますが、ファイル-Rに限定することはできません。.php

grep -R abc *

繰り返しますが、これは同じ望ましい出力を持っています。

find私はこれがあなたの質問に正確に答えるわけではないことを知っています..代替案-execです. (スクリプトには関係ありませんが、日常のシェル操作には役立ちます)grepxargs

于 2009-07-05T21:58:32.960 に答える
1
find /path -type f -name "*.php" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /time/){
            print $0":"line
            #do some other things here
        }
    }    
}'
于 2009-07-06T02:49:35.550 に答える