grep の出力を別の grep の検索パターンとしてパイプするにはどうすればよいですか?
例として:
grep <Search_term> <file1> | xargs grep <file2>
最初の grep の出力を 2 番目の grep の検索語として使用したい。上記のコマンドは、最初の grep の出力を 2 番目の grep のファイル名として扱っています。2 番目の grepのオプションを使用してみ-e
ましたが、どちらも機能しません。
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 ...
Bash を使用している場合は、バックティックを使用できます。
> grep -e "`grep ... ...`" files
-e
フラグと二重引用符は、ハイフンで始まるイニシャルからの出力がgrep
2 番目のオプションとして解釈されないようにするためにありますgrep
。
二重引用符のトリック (grep からの出力が単一のパラメーターとして扱われることも保証します) は、Bash でのみ機能することに注意してください。(t)csh では動作しないようです。
バッククォートは、あるプログラムからの出力を別のプログラムのパラメーター リストに取得する標準的な方法であることにも注意してください。(f)grep のように stdin からパラメータを読み取る便利な方法がすべてのプログラムにあるわけではありません。
現在のディレクトリ内のファイル名 (find を使用して検出) に特定のパターンが含まれるファイル (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 シェルの違いですか?
$() を使用して次のコマンドが機能することがわかりました。最初のコマンドを括弧内に挿入して、シェルに最初に実行させます。
grep $(dig +short) file
これを使用して、ホスト名が与えられたときに IP アドレスのファイルを調べます。