使用 awk 获取两行之间的内容

使用 awk 获取两行之间的内容

问题一:

我可以用来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 -Bgrep -Ased

问题2:两个相同的关键字'1'之间如何得到“1 2 3 4 5 6 7 8 1”?不要使用grep -Bgrep -Ased

答案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

相关内容