「hi」を含む行から「bye」を含む行に印刷するには、次のようにします。
awk'/hi/./bye/'
「hi」を含む行からファイルの終わりまで印刷するには、次のようにします。
awk'/ hi /、0'
これらの終了条件のいずれかで印刷を終了するようにスクリプトを作成するにはどうすればよいですか?
変数をフラグとしてawk
使用する場合p
:
$ cat file
start
line 2
hi
line 4
bye
end
$ awk '/hi/{p=1}{if (p) print}' file
hi
line 4
bye
end
$ awk '/hi/{p=1}{if (p) print}/bye/{p=0}' file
hi
line 4
bye
より簡潔:
$ awk '/hi/{p=1}p' file
hi
line 4
bye
end
$ awk '/hi/{p=1}p;/bye/{p=0}' file
hi
line 4
bye
しかし、私はこれが好きsed
です:
$ sed -n '/hi/,/bye/p' file
hi
line 4
bye
$ sed -n '/hi/,$p' file
hi
line 4
bye
end
私はあなたの質問を再フェーズしようとします:
「hi」を含む行から「bye」を含む行までファイルを印刷したいのですが、ファイルに「bye」がない場合は「hi」からEOFまで印刷します。(awk付き)
私の理解が正しければ、実際、あなたは自分自身に答えを与えました:
awk '/hi/,/bye/'
仕事をします。
でテストしてみましょうawk '/5/,/0/'
kent$ seq 12 |awk '/5/,/0/'
5
6
7
8
9
10
kent$ seq 9 |awk '/5/,/0/'
5
6
7
8
9
2番目のコマンドでは、「ファイル」に0がないため、/5/から最後まで出力されます。
Note
「見つかった」場合は「exit」を処理する必要があります。そうしないと、「bye」の後に「hi」を含む行がある場合は、それらも出力されます。
これがあなたが求めていたものであることを願っています。
awk '/hi/{f=1} f; /bye/{f=0}' file
区切り行のいずれかまたは両方を印刷する場合は、これら3つの条件を並べ替えるだけです。