テキストを見つけた後に特定の行を読み取るにはどうすればよいでしょうか?

テキストを見つけた後に特定の行を読み取るにはどうすればよいでしょうか?

テキストを見つけた後、特定の行数を読み取るにはどうすればよいですか?

例えば。:

「Unix」を見つけたら次の 2 行を読み取ります。

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

結果は次のようになります:

Test 5
Test 6

注: 最後の例の「Unix」は引数なので、他の任意のテキストにすることができます。

私が持っているもの:

まだアイデアが浮かばないのですが、必要なのはライトだけです。そのための別のスクリプトを作成することを考えています。

答え1

解決策grep

grep -A2 -P '^UNIX$' file

説明: -A意味: 一致後の次の2行を印刷する

またはawk:

awk '$0=="UNIX"{getline; print; getline; print}' file

説明:行 ( $0=="UNIX") で UNIX を検索します。見つかった場合は、次の行をバッファー ( getline) に取得し、バッファー ( print) を出力します。これは 2 回実行されます。

または以下を使用しますsed:

sed -n '/^UNIX$/{n;p;n;p}' file

説明:UNIX ( /^UNIX$/) を検索します。見つかった場合は、 内の部分を実行します{...}nは次を意味し、pは印刷を意味します。これも 2 回実行されます。

答え2

解決策awk:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

説明

  • /^UNIX$/{i=1;next}: が表示された場合UNIX、変数 を設定しi = 1、次の入力を処理します。

  • 変数iが設定されている場合 (つまり を確認した場合UNIX)、i && i++ <= 2の後の 2 行でのみ true 値に評価されUNIXawkデフォルトのアクション が実行されますprint $0

  • を見る前はUNIXiは定義されておらず、 の後の 3 行目から始まりUNIXiの値が 2 より大きいため、式がi && i++ <= 2false と評価され、awk何も行われません。

答え3

grep -A 2 UNIX file.txt

grep のマニュアルページでは、このオプションについて次のように説明されています。

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

答え4

以下を使用できますex:

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

どこ:

関連情報