いくつかのテキストを見つけた後、特定の行数を読み取るには?
例えば。 :
以下で「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と評価され、基本操作が実行されますUNIX
。awk
print $0
ビューの前には
UNIX
定義i
がなく、後で行3から始めると、UNIX
値i
が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
どこ:
1,/UNIX/d
-一致後のテキストの削除%p
- 印刷バッファq!
- 変更をファイルに保存せずに終了(wq
内部編集用)