いくつかのテキストを見つけた後、特定の行を読む方法は何ですか?

いくつかのテキストを見つけた後、特定の行を読む方法は何ですか?

いくつかのテキストを見つけた後、特定の行数を読み取るには?

例えば。 :

以下で「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

説明する:()行でUNIXを検索してください$0=="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と評価され、基本操作が実行されますUNIXawkprint $0

  • ビューの前にはUNIX定義iがなく、後で行3から始めると、UNIXiが2より大きくi && i++ <= 2なり、式はfalseと評価され、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

どこ:

関連情報