3 回答
TA贡献1868条经验 获得超4个赞
PAT1和PAT 2之间的打印线
$ awk '/PAT1/,/PAT2/' file PAT13 - first block4PAT2 PAT17 - second block PAT2 PAT110 - third block
awk '/PAT1/{flag=1} flag; /PAT2/{flag=0}' file
/PAT1/
匹配具有此文本的行,以及 /PAT2/
的确如此。 /PAT1/{flag=1}
设置 flag
当文本 PAT1
是在一行中找到的。 /PAT2/{flag=0}
取消设置 flag
当文本 PAT2
是在一行中找到的。 flag
是具有默认操作的模式,即 print $0
*如果 flag
等于1这一行是打印出来的。这样,它就可以打印所有从时间上出现的线条。 PAT1
发生,直到下一个 PAT2
都被看到了。这还将打印最后一次匹配的线条。 PAT1
直到文件的末尾。
PAT1和PAT 2之间的打印线-不包括PAT 1和PAT 2
$ awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file3 - first block47 - second block10 - third block
next
PAT1
next
awk '/PAT2/{flag=0} flag; /PAT1/{flag=1}' file
.
PAT1和PAT 2之间的打印线-包括PAT1
$ awk '/PAT1/{flag=1} /PAT2/{flag=0} flag' file PAT13 - first block4PAT17 - second block PAT110 - third block
flag
PAT1和PAT 2之间的打印线-包括PAT 2
$ awk 'flag; /PAT1/{flag=1} /PAT2/{flag=0}' file3 - first block4PAT27 - second block PAT210 - third block
flag
PAT1和PAT2之间的打印行-如果没有发生其他pat 2,则不包括从最后一个pat 1到文件末尾的行。
awk 'flag{ if (/PAT2/) {printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS } /PAT1/ {flag=1}' file
$ awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file3 - first block47 - second block# note the lack of third block, since no other PAT2 happens after it
TA贡献1860条经验 获得超9个赞
sed
pat 1和pat 2之间的打印线-包括pat 1和pat 2。
sed -n '/PAT1/,/PAT2/p' FILE
PAT1和PAT 2之间的打印线-排除PAT1和PAT 2
sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE
sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' FILE
sed -n '/PAT1/,/PAT2/{//!p}' FILE
sed -n '/PAT1/,/PAT2/{//!p;}' FILE
PAT1和PAT 2之间的打印线-包括PAT 1,但不包括PAT 2。
sed -n '/PAT1/,/PAT2/{/PAT2/!p}' FILE
sed -n '/PAT1/,/PAT2/{/PAT2/!p;}' FILE
在pat 1和pat 2之间的打印线-包括pat 2,但不包括pat 1。
sed -n '/PAT1/,/PAT2/{/PAT1/!p}' FILE
sed -n '/PAT1/,/PAT2/{/PAT1/!p;}' FILE
1
sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE
▶ sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE sed: 1: "/PAT1/,/PAT2/{/PAT1/!{/ ...": extra characters at the end of p command
TA贡献1815条经验 获得超12个赞
grep
$ grep -Pzo "(?s)(PAT1(.*?)(PAT2|\Z))" file PAT13 - first block4PAT2 PAT17 - second block PAT2 PAT110 - third block
-P
perl-regexp,PCRE.一点也不 grep
变体 -z
将输入视为一组行,每一行以零字节结尾,而不是换行符。 -o
只打印匹配 (?s)
都是.点也能找到新行。 (.*?)
非贪婪发现 \Z
只匹配字符串的末尾,或换行符后面的换行符。
标记之间的打印行(不包括结束标记):
$ grep -Pzo "(?s)(PAT1(.*?)(?=(\nPAT2|\Z)))" file PAT13 - first block4PAT17 - second block PAT110 - third block
(.*?)(?=(\nPAT2|\Z))
非贪婪查找 \nPAT2
和 \Z
除标记外的标记之间的打印行:
$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(?=(\nPAT2|\Z)))" file3 - first block47 - second block10 - third block
(?<=PAT1\n)
积极寻找 PAT1\n
标记之间的打印行(不包括开始标记):
$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(PAT2|\Z))" file3 - first block4PAT27 - second block PAT210 - third block
- 3 回答
- 0 关注
- 607 浏览
添加回答
举报