回答:
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行でのみ真の値に評価されUNIX、awkデフォルトのアクションが実行されますprint $0。
見る前にUNIX、i定義されていなかったと後に3行目から始まりUNIX、i表現が作る2よりも値が大きいほど、持っていたi && i++ <= 2発生しない、falseに評価さawkのDOは何も。
$回答の最初の記号はシェルプロンプトであり、awkコマンドの一部ではないことに注意してください。
awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
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$/)に移行します。これが見つかると、の一部がtxecuteされます{...}。n次をp意味し、印刷を意味します。これも2回行われます。
getline; print;がawkステートメントのn;p;一部またはステートメントの一部を繰り返す場合に番号を変更するにはsed。
grep -A100 -P '^UNIX$' file | tail -n +2ます。尾の部分は最初の先取特権を削除することです。他のもの(sed、awk)では、ループを作成する必要があるため、ループが単純になります。
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.
UNIXも出力に出力されます。
UNIX、パイプでtail: [...] | tail -n +1、またはにパイプしsedます[...] | sed '1d'。
tailとのsed '1d'候補UNIXは、入力テキストに1回だけ表示される場合にのみ正しく機能します。他のすべての回答では、複数の発生が可能です。提案する方が良いかもしれません... | grep -v UNIX。場合は確かに、これは厄介を取得しUNIXライン15および17に表示されます
sed何らかの形でsed '/UNIX/d;n;n;p/' /path/to/fileで実行できると確信しています。
これはうまくトリックをするようです:
sed -n '/UNIX/{n;p;n;p}' /path/to/file
コンセプトの証明:
$ for i in {1..9}; do echo $i; done | sed -n '/4/{n;p;n;p}'
5
6
forループの周りのサブシェルは必要ありません。
以下を使用できますex。
ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin
どこ:
1,/UNIX/d- 一致後にテキストを削除します%p -バッファを印刷しますq!-ファイルへの変更を保存せずに終了(wqインプレース編集に使用)