3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
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}
設(shè)置 flag
當(dāng)文本 PAT1
是在一行中找到的。 /PAT2/{flag=0}
取消設(shè)置 flag
當(dāng)文本 PAT2
是在一行中找到的。 flag
是具有默認(rèn)操作的模式,即 print $0
*如果 flag
等于1這一行是打印出來(lái)的。這樣,它就可以打印所有從時(shí)間上出現(xiàn)的線條。 PAT1
發(fā)生,直到下一個(gè) 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之間的打印行-如果沒(méi)有發(fā)生其他pat 2,則不包括從最后一個(gè)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貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
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貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
grep
$ grep -Pzo "(?s)(PAT1(.*?)(PAT2|\Z))" file PAT13 - first block4PAT2 PAT17 - second block PAT2 PAT110 - third block
-P
perl-regexp,PCRE.一點(diǎn)也不 grep
變體 -z
將輸入視為一組行,每一行以零字節(jié)結(jié)尾,而不是換行符。 -o
只打印匹配 (?s)
都是.點(diǎn)也能找到新行。 (.*?)
非貪婪發(fā)現(xiàn) \Z
只匹配字符串的末尾,或換行符后面的換行符。
標(biāo)記之間的打印行(不包括結(jié)束標(biāo)記):
$ grep -Pzo "(?s)(PAT1(.*?)(?=(\nPAT2|\Z)))" file PAT13 - first block4PAT17 - second block PAT110 - third block
(.*?)(?=(\nPAT2|\Z))
非貪婪查找 \nPAT2
和 \Z
除標(biāo)記外的標(biāo)記之間的打印行:
$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(?=(\nPAT2|\Z)))" file3 - first block47 - second block10 - third block
(?<=PAT1\n)
積極尋找 PAT1\n
標(biāo)記之間的打印行(不包括開(kāi)始標(biāo)記):
$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(PAT2|\Z))" file3 - first block4PAT27 - second block PAT210 - third block
添加回答
舉報(bào)