Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk:找到多个字符串并打印出来_Bash_Awk - Fatal编程技术网

Bash awk:找到多个字符串并打印出来

Bash awk:找到多个字符串并打印出来,bash,awk,Bash,Awk,我想打印出输入文件中包含“数字”以及“开始”和“结束”之间的行,并在同一输出文件上打印出来 我写的代码 awk -v string="number" '$0~string' Input >> Output awk ' /start/ {flag=1;next} /end/{flag=0} flag { print $0}' Input >> Output 然而,它给了我这种输出,而这并不是我真正想要的 number 1 number 2 start line 7 lin

我想打印出输入文件中包含“数字”以及“开始”和“结束”之间的行,并在同一输出文件上打印出来

我写的代码

awk -v string="number" '$0~string' Input >> Output
awk ' /start/ {flag=1;next} /end/{flag=0} flag { print $0}' Input >> Output
然而,它给了我这种输出,而这并不是我真正想要的

number 1
number 2
start
line 7
line 8
line 9
end
start
line 14
line 15
line 16
end
我想要的是

输入数据:

line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
line 15
line 16
end
输出:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
使用sed

sed -n '/number/p;/start/,/end/p' file
使用sed

sed -n '/number/p;/start/,/end/p' file
在awk中:

$ awk '/number/;/start/,/end/' file
输出:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
然而,解决方案中存在一个问题。如果开始-结束块中有编号,则会打印两次。如果数据就是这样,@Ravinder的解决方案就是解决方案。

在awk中:

$ awk '/number/;/start/,/end/' file
输出:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

然而,解决方案中存在一个问题。如果开始-结束块中有编号,则会打印两次。如果数据是这样的,@Ravinder的解决方案就是解决方案。

请尝试以下操作,这样可以避免在
开始
结束
之间打印字符串
数字
两次

awk '/start/,/end/{print;next}; /number/'  Input_file
假设下面是输入文件(我通过在其中添加字符串
number
在其中添加了一个小编辑)


请尝试以下操作,这样可以避免打印字符串
number
2次,以防它也在
start
end
之间

awk '/start/,/end/{print;next}; /number/'  Input_file
假设下面是输入文件(我通过在其中添加字符串
number
在其中添加了一个小编辑)


就我个人而言,我从不使用范围表达式,因为它使琐碎事情的代码变得非常简短,但当您的需求发生变化时,需要完全重写或复制条件。我总是用旗子来代替:

$ awk '/start/{f=1} f || /number/{print} /end/{f=0}' file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
f
用于
found
,而不是
标志
——标志是变量的类型,found是它的意思。wrt将数字改为其他数字,以下是对您可能的意思的一种解释:

$ awk '/start/{f=1} f || sub(/number/,"foobar"){print} /end/{f=0}' file
foobar 1
start
line 7
line 8
line 9
end
foobar 2
start
line 14
line 15
line 16
end

就我个人而言,我从不使用范围表达式,因为它使琐碎事情的代码变得非常简短,但当您的需求发生变化时,需要完全重写或复制条件。我总是用旗子来代替:

$ awk '/start/{f=1} f || /number/{print} /end/{f=0}' file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end
f
用于
found
,而不是
标志
——标志是变量的类型,found是它的意思。wrt将数字改为其他数字,以下是对您可能的意思的一种解释:

$ awk '/start/{f=1} f || sub(/number/,"foobar"){print} /end/{f=0}' file
foobar 1
start
line 7
line 8
line 9
end
foobar 2
start
line 14
line 15
line 16
end

我知道这种形式的
sed
但刚刚学会了一种新的
awk
技巧我知道这种形式的
sed
但刚刚学会了一种新的
awk
技巧谢谢你的回答。假设我还想用输出文件上的其他内容更改名称“number”。@usermrt,然后尝试此操作,并让我知道
awk'/start/,/end/{print;next}/number/{sub(“number”,“new\u thing\u by\u OP”);print}输入文件
?@usermrt,np,很高兴它对您有所帮助。
/number/{sub(“number”,“new\u thing\u by\u OP”);print}
=
sub(/number/,“new\u thing\u by\u OP”)
/bin/bash defdatano=6表示$(eval seq 0 1$($defdatano-1)))中的datano,执行{echo$datano awk'/#DATA'$($datano-1))/,/#END/{print;next};/#AUTHORS/{sub sub(“#AUTHORS”,“s'$datano'));print}DataInput>>DataOutput}谢谢你的回答。假设我还想用输出文件上的其他内容更改名称“number”。@usermrt,然后尝试此操作,并让我知道
awk'/start/,/end/{print;next}/number/{sub(“number”,“new\u thing\u by\u OP”);print}输入文件
?@usermrt,np,很高兴它对您有所帮助。
/number/{sub(“number”,“new\u thing\u by\u OP”);print}
=
sub(/number/,“new\u thing\u by\u OP”)
/bin/bash defdatano=6表示$(eval seq 0 1$($defdatano-1)))中的datano做{echo$datano awk'/#DATA'$($datano-1))/,/#END/{print;next};/#AUTHORS/{sub sub(“#AUTHORS”,“s'$datano'));print}数据输入>>数据输出}完成你发布的脚本不会产生你所说的输出。你发布的脚本不会产生你所说的输出。