grep -A1 'blah' logfile
'blah'を含むすべての行に対するこのコマンドのおかげで、 'blah'を含む行とそれに続く次の行のログファイルに出力が得られます。それは単純なものかもしれませんが、 'blah'とのみを含む行を次の行に表示する方法を見つけることができません。
あなたはawkで試すことができます:
awk '/blah/{getline; print}' logfile
grepに固執したいなら:
grep -A1 'blah' logfile|grep -v "blah"
または
sed -n '/blah/{n;p;}' logfile
配管はあなたの友達です...
grep -A1
を使用して一致した後の次の行を表示してから、結果をtail
にパイプして1行だけ取得
cat logs/info.log | grep "term" -A1 | tail -n 1
Raimからの素晴らしい答えは、私にとってとても役に立ちました。これを印刷に拡張するのは簡単です。パターンの後の7行目
awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile
一般的に言って、私はあなたがここで多くのgrepを求めていることに同意します、そして別のツールがより良い解決策かもしれないということです。しかし、組み込み環境では、これを行うためだけにsed
やawk
を使用したくない場合があります。私は次の解決策を見つけました(それらが連続したマッチでない限り):
grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
基本的には、それらをマッチさせ、マッチごとに1行のコンテキストを追加し、それから元のパターンの逆マッチを通してそれらを取り除きます。もちろん、これはあなたのパターンが「次の」行に現れないと仮定できることを意味します。
これまでにこの質問に対して多くの良い答えが出されていますが、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
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つのコマンドがあるのでちょっとカンニング
Grepでこれを行う方法はわかりませんが、同じ結果を得るためにawkを使用することは可能です。
awk '/blah/ {getline;print}' < logfile
その次の行に 'blah'が含まれていない場合は、次のようにしてそれらをフィルタ処理できます。
grep -A1 blah logfile | grep -v blah
cat logfile | ...
の使用は不要です。
間違ったツールを使っているようです。 Grepはそれほど洗練されていません。仕事の道具としてawkにステップアップしたいと思います。
awk '/blah/ { getline; print $0 }' logfile
何か問題があれば教えてください、ちょっとawkを学ぶ価値があると思います。すばらしいツールです:)
pSこの例は「猫の無駄な使用」賞を獲得しません;) http://porkmail.org/era/unix/award.html