我正在尝试做一些我认为可以很容易完成的事情,但我似乎无法找到答案。我想使用awk来挑选两个模式之间的线条,但我也希望模式匹配两个连续的线条。我试图在互联网上找到解决方案,或许我没有搜索正确的关键字。一个例子可以更好地描述这一点。
假设我有以下名为test的文件:
aaaa
bbbb
SOME CONTENT 1
ddddd
fffff
aaaa
cccc
SOME CONTENT 2
ccccc
fffff
例如,假设我想找到" SOME CONTENT 1"
然后我会像这样使用awk:
cat test | awk '/aaa*/ { show=1} show; /fff*/ {show=0}'
但这不是我想要的。我想以某种方式进入模式:
aaaa*\nbbbb*
结束模式也一样。有什么建议怎么做?
答案 0 :(得分:3)
您可以使用:
awk '/aaa*/ {f=1} /bbb*/ && f {show=1} show; /fff*/ {show=f=0}' file
bbbb
SOME CONTENT 1
ddddd
fffff
如果pattern1为aaa*
,则设置标记f
如果pattern2为bbb*
且标志f
为true,则设置show
标志
如果您需要打印patter1 aaa*
?
awk '/aaa*/ {f=$0} /bbb*/ && f {show=1;$0=f RS $0} show; /fff*/ {show=f=0}' file
aaaa
bbbb
SOME CONTENT 1
ddddd
fffff
答案 1 :(得分:1)
如果每条记录以fffff
结尾,并且GNU awk
可用,您可以执行以下操作:
$ awk '/aaa*\nbbbb*/' RS='fffff' file
aaaa
bbbb
SOME CONTENT 1
ddddd
或者,如果您只想显示SOME CONTENT 1
,则可以执行以下操作:
$ awk -F $'\n' '/aaa*\nbbbb*/{print $4}' RS='fffff' file
SOME CONTENT 1
答案 2 :(得分:0)
我搜索了两个模式并检查它们是否连续使用行号,行号允许sed在它们之间插入一行,就在第一行/模式之后。
awk '$0 ~ "Encryption" {print NR} $0 ~ "Bit Rates:1" {print NR}' /tmp/mainscan | while read line1; do read line2; echo "$(($line2 - 1)) $line1"; done > /tmp/this
while read line
do
pato=$(echo $line | cut -f1 -d' ')
patt=$(echo $line | cut -f2 -d' ')
if [[ "$pato" = "$patt" ]]; then
inspat=$((patt + 1))
sed -i "${inspat}iESSID:##" /tmp/mainscan
sed -i 's/##/""/g' /tmp/mainscan
fi
done < /tmp/this