awk
「start」の入力ファイルを検索し、「next」を含む行を見つけて、次の行を表示するスクリプトを作成するにはどうすればよいですか?このような:
[user]$ cat test.txt
start
next
This line should print
Ignore this
[user]$ display.awk test.txt
This line should print
[user]$ cat test1.txt
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too
start
Ignore this too
[user]$ display.awk test1.txt
This line should print
答え1
これは文章です:
awk 'BEGIN {start="no"; nextline="no"}; nextline=="yes" {print; exit}; (start=="yes" && /^next$/) {nextline="yes"}; /^start$/ {start="yes"}' test.txt
スタンドアロンスクリプトで:
#!/bin/awk -f
BEGIN {start="no"; nextline="no"}
nextline=="yes" {print; exit}
(start=="yes" && /^next$/) {nextline="yes"}
/^start$/ {start="yes"}
説明する
最初のポイントを最初に読んだ後、残りのポイントを逆に読み取る方が合理的です。
BEGIN {start="no"; nextline="no"}
:まず、2つの変数を次に設定します"no"
(つまり、まだ見つかりませんでした)。 NBはnext
予約語なので使用しましたnextline
。nextline=="yes" {print; exit}
next
:前の行で見つかった場合は、その行を印刷して終了します。(start=="yes" && /^next$/) {nextline="yes"}
:発見後の行でも検索すると次に設定さstart
れます。next
nextline
"yes"
/^start$/ {start="yes"}
:開始が見つかったらstart
に設定します"yes"
。
答え2
代替ソリューションsed
:
sed -n '/start/,${ # in this range
$!{ # if not the last line
/next/{ # and if line matches "next"
n # read in the next line
p # print pattern space
q # quit
}
}
}' infile
そしてgnu sed
:
sed -n '/start/,${$!{/next/{n;p;q}}}' infile
答え3
これも動作するはずです
awk 'BEGIN {l1=0} /^start$/{l1=1} /^next$/ && l1==1 {l2=NR+1} NR==l2 {print;l1=0}' test.txt
これは、レコード番号NRを使用して、出発線以降に最初に会ったレコード以降のレコードを印刷する。