web-dev-qa-db-ja.com

一致した行の後に次の行だけを表示する方法

grep -A1 'blah' logfile

'blah'を含むすべての行に対するこのコマンドのおかげで、 'blah'を含む行とそれに続く次の行のログファイルに出力が得られます。それは単純なものかもしれませんが、 'blah'とのみを含む行を次の行に表示する方法を見つけることができません。

192
facha

あなたはawkで試すことができます:

awk '/blah/{getline; print}' logfile
170
Michał Šrajer

grepに固執したいなら:

grep -A1 'blah' logfile|grep -v "blah"

または

sed -n '/blah/{n;p;}' logfile
135
Kent

配管はあなたの友達です...

grep -A1を使用して一致した後の次の行を表示してから、結果をtailにパイプして1行だけ取得

cat logs/info.log | grep "term" -A1 | tail -n 1
27
weisjohn

Raimからの素晴らしい答えは、私にとってとても役に立ちました。これを印刷に拡張するのは簡単です。パターンの後の7行目

awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile
13
souter

一般的に言って、私はあなたがここで多くのgrepを求めていることに同意します、そして別のツールがより良い解決策かもしれないということです。しかし、組み込み環境では、これを行うためだけにsedawkを使用したくない場合があります。私は次の解決策を見つけました(それらが連続したマッチでない限り):

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ

基本的には、それらをマッチさせ、マッチごとに1行のコンテキストを追加し、それから元のパターンの逆マッチを通してそれらを取り除きます。もちろん、これはあなたのパターンが「次の」行に現れないと仮定できることを意味します。

5
Travis Griggs

これまでにこの質問に対して多くの良い答えが出されていますが、awkを使用していないgetlineにはまだ見逃しています。 --- 一般的に なので、getlineを使う必要はありません。

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"

または

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"

論理は常に "blah"が見つかった行を格納してから1行後の行を出力することです。

テスト

サンプルファイル

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7

"blah"の後のすべての行を取得してください。最初のものの後に表示される場合、これが別の「何とか」を印刷します。

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7

"blah"が含まれていない場合は、 "blah"の後のすべての行を取得します。

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7
5
fedorqui

Perlのワンライナーアラート

ただの楽しみのために...試合の後に1行だけを印刷する

Perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt

もっと楽しく...試合後の次の10行を印刷する

Perl -lne 'Push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print' data.txt

実際には2つのコマンドがあるのでちょっとカンニング

4
beasy

Grepでこれを行う方法はわかりませんが、同じ結果を得るためにawkを使用することは可能です。

awk '/blah/ {getline;print}' < logfile
4
raimue

その次の行に 'blah'が含まれていない場合は、次のようにしてそれらをフィルタ処理できます。

grep -A1 blah logfile | grep -v blah

cat logfile | ...の使用は不要です。

4
ott--

間違ったツールを使っているようです。 Grepはそれほど洗練されていません。仕事の道具としてawkにステップアップしたいと思います。

awk '/blah/ { getline; print $0 }' logfile

何か問題があれば教えてください、ちょっとawkを学ぶ価値があると思います。すばらしいツールです:)

pSこの例は「猫の無駄な使用」賞を獲得しません;) http://porkmail.org/era/unix/award.html

3
sillyMunky