21

複数のgrepを相互にパイプするだけでなく、前のgrepの結果に基づいてgrepを実行する方法はありますか?たとえば、以下のログファイル出力があるとします。

ID 1000 xyz occured
ID 1001 misc content
ID 1000 misc content
ID 1000 status code: 26348931276572174
ID 1000 misc content
ID 1001 misc content

まず、ログファイルファイル全体をgrepして、「xyzが発生しました」が存在するかどうかを確認したいと思います。そうである場合は、そのイベントのID番号を取得し、そのID番号を持つファイル内のすべての行をgrepして、ステータスコードを探します。

xargsなどを使用できると想像していましたが、機能しないようです。

grep "xyz occured" file.log | awk '{ print $2 }' | xargs grep "status code" | awk '{print $NF}'

実際にこれを行う方法についてのアイデアはありますか?

4

6 に答える 6

29

grepの一般的な答え-grep-ed出力:

grep 'patten1' *.txt | grep 'pattern2' 

2番目のgrepがファイルを指していないことに注意してください。

クールなgrepの詳細はこちら

于 2014-09-08T14:54:19.997 に答える
7

もうすぐです。ただし、xargsを使用して必要な処理を実行できる場合もありますが(次のコマンドが引数をとる方法によって異なります)、実際には、抽出したIDのgrepにxargsを使用しているわけではありません。最初のgrep(IDコードを含む)の出力を取得し、それを次のgrepの式で使用する必要があります。何かのようなもの:

grep "^ID `grep 'xyz occured' file.log | awk '{print $2}'` status code" file.log

明らかに別のオプションは、これを1回のパスで実行するスクリプトを作成することです。これはEdの提案です。

于 2013-02-06T17:57:47.623 に答える
1

awkを使用するだけです:

awk '{info[$2] = info[$2] $0 ORS} /xyz occured/{ids[$2]} END{ for (id in ids) printf "%s",info[id]}' file.log

また:

awk '/status code/{code[$2]=$NF} /xyz occured/{ids[$2]} END{ for (id in ids) print code[id]}' file.log

本当に出力したいものによって異なります。あなたの質問で期待されるいくつかの出力が役立つでしょう。

于 2013-02-06T17:51:52.777 に答える
1

以前のGrepの結果をGrepします。

このファイルの内容を考えると:

ID 1000 xyz occured
ID 1001 misc content
ID 1000 misc content
ID 1000 status code: 26348931276572174
ID 1000 misc content
ID 1001 misc content

このコマンド:

grep "xyz" file.log | awk '{ print $2 }' > f.log; grep `cat f.log` file.log;

これを返します:

ID 1000 xyz occured
ID 1000 misc content
ID 1000 status code: 26348931276572174
ID 1000 misc content

file.logで「xyz」を検索し、結果をf.logに配置します。次に、file.logでそのIDを取得します。外側のgrepが複数のID番号を返す場合、内側のgrepは最初のID番号のみを検索し、他のID番号でエラーを出します。

于 2013-02-06T17:57:04.947 に答える
1

さらに別の方法

for x in `grep "xyz occured" file.log | cut -d\  -f2`
do
  grep $x file.log
done

この方法で私が気に入っているのは、必要に応じて、ステータスコードごとに出力をファイルに書き込むことができることです。

grep $x file.log >> /var/tmp/$x.out
于 2013-08-12T04:04:18.963 に答える
1

これはすべて、絞り込まれた検索範囲でファイルを取得することです。あなたの場合、検索範囲はファイルの内容によって決定されます。

多くの検索(以前のgrep結果にフィルターを適用)を通じて検索範囲を縮小しているときに、この問題をより頻繁に発見しました。

一般的な答えを見つけようとしています

1)最初のgrepの結果を含むリストを生成します。

grep pattern | awk -F':' '{print $1}'

2)ここのようなファイルのリストへの2番目のgrep

xargs grep -i pattern

xargs3)このカスケードフィルターを適用して、ファイル名のみを取得し、ファイル名をに渡すため にawkを追加するだけで済みます。grep -i

例えば:

grep 'pattern1' | awk -F':' '{print $1}' | xargs grep -i 'pattern2'
于 2015-09-20T11:55:23.180 に答える