前の 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
のみを指定します この結果の行が返されます。