问题一:
我可以用来awk
获取两个不同关键字之间的行,如下所示
$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:两个相同的关键字'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 的值不为零,则打印该行
答案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