grep -A1 'blah' logfile
「blah」が含まれているすべての行に対するこのコマンドのおかげで、「blah」を含む行の出力と、ログファイルの次の行が表示されます。それは単純なものかもしれませんが、「何とか」がある行を省略して、出力に次の行のみを表示する方法を見つけることができません。
curl whatismyip.org | grep -A1 'Your IP Address'
-A1
。ありがとう!
grep -A1 'blah' logfile
「blah」が含まれているすべての行に対するこのコマンドのおかげで、「blah」を含む行の出力と、ログファイルの次の行が表示されます。それは単純なものかもしれませんが、「何とか」がある行を省略して、出力に次の行のみを表示する方法を見つけることができません。
curl whatismyip.org | grep -A1 'Your IP Address'
-A1
。ありがとう!
回答:
grepを使い続ける場合:
grep -A1 'blah' logfile|grep -v "blah"
または
sed -n '/blah/{n;p;}' 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"
ロジックは常に、「何とか」が見つかった行を保存してから、1行後の行を印刷することです。
サンプルファイル:
$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7
「何とか」の後のすべての行を取得します。これは、最初のものの後に現れる場合、別の「何とか」を印刷します。
$ 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つあるので
$. == $next && print
と同じprint if $. == $next
grep -A1
)。次の行のみを印刷し、一致する行は印刷しない場合は、この順序を維持します。(ちょうど$ nextが連続試合でどのように破壊されるかを指摘するだけです)
間違ったツールを使用しているようです。Grepはそれほど洗練されていません。仕事のツールとしてawkにステップアップしたいと思います。
awk '/blah/ { getline; print $0 }' logfile
問題が発生した場合はお知らせください。awkを少し学ぶ価値があると思います。すばらしいツールです:)
psこの例は「猫賞の無用な使用」を勝ち取りません;) http://porkmail.org/era/unix/award.html
-A1
オプションを探してここに来ると思います