web-dev-qa-db-ja.com

Linuxのgrepの検索仕様として使用するパイプ出力

Grepの出力を別のgrepの検索パターンとしてパイプするにはどうすればよいですか?

例として:

grep <Search_term> <file1> | xargs grep <file2>

最初のgrepの出力を2番目のgrepの検索語として使用します。上記のコマンドは、最初のgrepの出力を2番目のgrepのファイル名として扱います。 2番目のgrepに-eオプションを使用してみましたが、どちらも機能しません。

27
Sripal

Bashを使用している場合は、バックティックを使用できます。

> grep -e "`grep ... ...`" files

-eフラグと二重引用符は、ハイフンで始まる最初のgrepからの出力が2番目のgrepのオプションとして解釈されないようにするためにあります。

二重引用符のトリック(grepからの出力が単一のパラメーターとして扱われることも保証します)はBashでのみ機能することに注意してください。 (t)cshでは動作しないようです。

また、バックティックは、あるプログラムから別のプログラムのパラメーターリストに出力を取得する標準的な方法であることにも注意してください。すべてのプログラムに、(f)grepが行うようにstdinからパラメーターを読み取るための便利な方法があるわけではありません。

8
Alnitak

xargs-iスイッチを使用する必要があります。

grep ... | xargs -ifoo grep foo file_in_which_to_search

これは、-i(この場合はfoo)の後にオプションを取り、コマンド内のすべての出現箇所を最初のgrepの出力で置き換えます。

これは次と同じです:

grep `grep ...` file_in_which_to_search
14
Nathan Fellman

試す

grep ... | fgrep -f - file1 file2 ...
12
Paul Tomblin

現在のディレクトリで、ファイル名に特定のパターンが含まれているファイル(grepを使用)のテキストを検索したい(検索を使用して見つかった)。次のコマンドを使用しました。

 grep -i "pattern1" $(find . -name "pattern2")

ここでpattern2はファイル名のパターンであり、pattern1はパターンですpattern2に一致するファイル内を検索しました。

編集:厳密にはパイピングではありませんが、関連性が高く、非常に便利です...

4
mcvz

これは、リストからファイルを検索するために使用するものです。

ls -la | grep 'file-in-which-to-search'
2
Jim Lahman

これは答えではないので、ルールを破ってください。これらのソリューションが機能しないことに注意してください。

% 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シェルの違いなのですか?

1
SidMuchRock

私はこの方法を試しました、そしてそれは素晴らしい働きをします。

[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]$ 
1
Vincent Jia

このような方法で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に渡すことができます

0
armagedescu