GNU/Linux >> Linux の 問題 >  >> Linux

grepさ​​れた行の後にn行目を取得する方法は?

前の 2 つの回答に問題はありませんが、パターンの後の 3 行目を見つけることは単一の sed で実行できることに注意してください。 コール:

sed -n "/four/ { n; n; p }" SourceData.txt

1 つのプログラムが作業を行うため、複数のフィルターを実行するよりも効率的です。上記のコマンドは、「four」のすべてのインスタンスの後に 3 行目を出力しますが、これが一致に続く 2 行のいずれかで再び発生する場合を除きます (他のソリューションも、このケースを期待どおりに処理しません)。また、パターンがファイルの最後の行または最後から 2 番目の行にある場合、出力は生成されません。これは、必要な場合とそうでない場合があります。

最初のインスタンスのみを照合するには:

sed -n "/four/ { n; n; p; q }" SourceData.txt

(この回答は、一致が見つかったらすぐにスキャンを終了することにより、可能な限り効率的であることに注意してください。)

sed を知る価値があるため、このソリューションを追加します。 そして、かなり不快な構文 (正規表現は十分に悪いものです!) にも関わらず、非常に役立つことがよくあります。このチュートリアルは良い入門書です。


このソリューションは、2 行前に一致があった場合に現在の行を出力します。前の試合の直後に別の試合が発生した場合でも、別の試合を見逃すことはないため、他のいくつかの回答とは少し異なります。

awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'

一致するたびに、情報は t[0] に保存されます .各行で t 配列がシフトされます (t[-1] のシフトを含む) t[0]まで t[0] の値をリセットするには )。 2 行前に一致があったことを配列が示している場合、行は出力されます。

別の遅延を簡単に設定できます (例:delay=7 ) または別のパターンを使用する (例:/sda[[:digit:]]/ )


この式を使用できます (input.txt ):

grep "four" -A 2 input.txt | tail -n 1

出力は次のとおりです:

six 6

grep オプション "-A 2" は、一致した行の 2 行後を出力するように指定します。
そして tail オプション "-n 1" は、最後の 1 のみを指定します この結果の行が返されます。


Linux
  1. コマンドラインを使用してディレクトリ内のファイルの数を取得するにはどうすればよいですか?

  2. Kshのバージョンを安全に入手する方法は?

  3. 自動マウントのUSBキーを取得するにはどうすればよいですか?

  1. マッチングパターンの後にラインの一部のみを返しますか?

  2. ディレクトリのコンテンツのMd5合計を1つの合計として取得するにはどうすればよいですか?

  3. Pythonで(MB)ファイルのtar.gzのサイズを取得する方法

  1. Makefile でユーザー名を取得するにはどうすればよいですか?

  2. sed - 一致後に X 行の後に行を挿入する

  3. Linuxコマンドラインでビデオのフレーム数を取得するにはどうすればよいですか?