テキストを見つけた後、特定の行数を読み取るにはどうすればよいですか?
例えば。:
「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 値に評価され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
インプレース編集に使用)