質問1:
awk
次のように、2つの異なるキーワード間の行を取得するために使用できます。
$cat test1.sh
#!/bin/bash
awk '/1/,/5/{print}' file.txt
$ cat file.txt
0
1
2
3
4
5
6
7
8
1
q
出力は次のとおりです
$ sh -x test1.sh
+ awk '/1/,/5/{print}' file.txt
1
2
3
4
5
1
q
「1 2 3 4 5」のみどうやって入手できますか?使用しないでくださいgrep -B
。grep -A
sed
質問2:2つの同じキーワード「1」の間で「1 2 3 4 5 6 7 8 1」を取得するには?とを使用しないでくださいgrep -B
。grep -A
sed
答え1
エクスポートを使用できます。
$ awk '/1/,/5/{print}$0==5{exit}' file.txt
$ awk '$1==1{a++}a>=2{print;exit}a{print}' file.txt
1
2
3
4
5
6
7
8
1
$1==1{a++} --> 最初のフィールド値が 1 の場合、変数 a の値を増やします。
a> = 2 {print; exit} --> a値が2以上の場合は、現在の行を印刷して終了します(ファイルを処理しなくなりました)。
a{print} --> aの値が0でない場合は、次の行を印刷します。
答え2
sed
作業に適したツールです。なぜ使うべきではないのか分からない。これが宿題であれば、先生に文句を言うことを検討してください。
$ sed -n -e '/^1/,/^5/p' -e '/^5/q' file.txt
1
2
3
4
5
このコマンドは、sed
()と一致する行p
の間のすべての行を印刷します。また、一致する行が見つかると終了()されます。デフォルトの出力はオフ()です。/^1/
/^5/
q
/^5/
-n
$ sed -n '/^[1-9]/p' file.txt
1
2
3
4
5
6
7
8
1