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 blocknextPAT1
nextawk '/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 blockflag
PAT1和PAT 2之间的打印线-包括PAT 2
$ awk 'flag; /PAT1/{flag=1} /PAT2/{flag=0}' file3 - first block4PAT27 - second block
PAT210 - third blockflag
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 itTA贡献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}}' FILEsed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' FILEsed -n '/PAT1/,/PAT2/{//!p}' FILEsed -n '/PAT1/,/PAT2/{//!p;}' FILEPAT1和PAT 2之间的打印线-包括PAT 1,但不包括PAT 2。
sed -n '/PAT1/,/PAT2/{/PAT2/!p}' FILEsed -n '/PAT1/,/PAT2/{/PAT2/!p;}' FILE在pat 1和pat 2之间的打印线-包括pat 2,但不包括pat 1。
sed -n '/PAT1/,/PAT2/{/PAT1/!p}' FILEsed -n '/PAT1/,/PAT2/{/PAT1/!p;}' FILE1
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 commandTA贡献1815条经验 获得超13个赞
grep
$ grep -Pzo "(?s)(PAT1(.*?)(PAT2|\Z))" file PAT13 - first block4PAT2 PAT17 - second block PAT2 PAT110 - third block
-Pperl-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 关注
- 691 浏览
添加回答
举报
