Grepの出力を別のgrepの検索パターンとしてパイプするにはどうすればよいですか?
例として:
grep <Search_term> <file1> | xargs grep <file2>
最初のgrepの出力を2番目のgrepの検索語として使用します。上記のコマンドは、最初のgrepの出力を2番目のgrepのファイル名として扱います。 2番目のgrepに-e
オプションを使用してみましたが、どちらも機能しません。
Bashを使用している場合は、バックティックを使用できます。
> grep -e "`grep ... ...`" files
-e
フラグと二重引用符は、ハイフンで始まる最初のgrep
からの出力が2番目のgrep
のオプションとして解釈されないようにするためにあります。
二重引用符のトリック(grepからの出力が単一のパラメーターとして扱われることも保証します)はBashでのみ機能することに注意してください。 (t)cshでは動作しないようです。
また、バックティックは、あるプログラムから別のプログラムのパラメーターリストに出力を取得する標準的な方法であることにも注意してください。すべてのプログラムに、(f)grepが行うようにstdinからパラメーターを読み取るための便利な方法があるわけではありません。
xargs
の-i
スイッチを使用する必要があります。
grep ... | xargs -ifoo grep foo file_in_which_to_search
これは、-i
(この場合はfoo
)の後にオプションを取り、コマンド内のすべての出現箇所を最初のgrep
の出力で置き換えます。
これは次と同じです:
grep `grep ...` file_in_which_to_search
試す
grep ... | fgrep -f - file1 file2 ...
現在のディレクトリで、ファイル名に特定のパターンが含まれているファイル(grepを使用)のテキストを検索したい(検索を使用して見つかった)。次のコマンドを使用しました。
grep -i "pattern1" $(find . -name "pattern2")
ここでpattern2はファイル名のパターンであり、pattern1はパターンですpattern2に一致するファイル内を検索しました。
編集:厳密にはパイピングではありませんが、関連性が高く、非常に便利です...
これは、リストからファイルを検索するために使用するものです。
ls -la | grep 'file-in-which-to-search'
これは答えではないので、ルールを破ってください。これらのソリューションが機能しないことに注意してください。
% fgrep -f test file
正常に動作します。
% cat test | fgrep -f - file
fgrep: -: No such file or directory
失敗します。
% cat test | xargs -ifoo grep foo file
xargs: illegal option -- i
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
[-L number] [-n number [-x]] [-P maxprocs] [-s size]
[utility [argument ...]]
失敗します。大文字のIが必要であることに注意してください。私がそれを使用する場合、すべてが良いです。
% grep "`cat test`" file
一致する用語の行を返すという点で機能しますが、一致が見つからないファイルごとにgrep: line 3 in test: No such file or directory
の行も返します。
何かが足りないのですか、それとも私のDarwinディストリビューションまたはbashシェルの違いなのですか?
私はこの方法を試しました、そしてそれは素晴らしい働きをします。
[opuser@vjmachine abc]$ cat a
not problem
all
problem
first
not to get
read problem
read not problem
[opuser@vjmachine abc]$ cat b
not problem xxy
problem abcd
read problem werwer
read not problem 98989
123 not problem 345
345 problem tyu
[opuser@vjmachine abc]$ grep -e "`grep problem a`" b --col
not problem xxy
problem abcd
read problem werwer
read not problem 98989
123 not problem 345
345 problem tyu
[opuser@vjmachine abc]$
このような方法でgrepを実行し、ファイル名のみを抽出するには、パラメーター-l(小文字のL)を参照してください。
grep -l someSearch * | xargs grep otherSearch
単純なgrepの場合、出力はファイル名のみよりもはるかに多くの情報になるためです。例えばあなたがするとき
grep someSearch *
あなたはこのようなxargs情報にパイプします
filename1: blablabla someSearch blablabla something else
filename2: bla someSearch bla otherSearch
...
上記の行のいずれかをパイプすると、xargsに渡すのは無意味になります。しかし、grep -l someSearch *を実行すると、出力は次のようになります。
filename1
filename2
このような出力をxargsに渡すことができます