[英]awk print only lines between two patterns removing first match
這一個在兩種模式之間打印
printf "/n"| openssl s_client -showcerts -connect www.google.com:443 | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/'
然后,這將刪除第一個匹配集,然后打印所有多余的垃圾
printf "/n"| openssl s_client -showcerts -connect www.google.com:443 | awk '/-----BEGIN CERTIFICATE-----/{f=1;++c} !(f && c==2); /-----END CERTIFICATE-----/{f=0}'
我想獲得第二個結果,而只用兩個awks就可以消除模式匹配之外的多余內容。
printf "/n"| openssl s_client -showcerts -connect www.google.com:443 | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' | awk '/-----BEGIN CERTIFICATE-----/{f=1;++c} !(f && c==2); /-----END CERTIFICATE-----/{f=0}'
但是,如果可能的話,我想合而為一。
這似乎與這個問題非常相似,我將sed答案修改如下:
sed -n '/-----BEGIN CERTIFICATE----/,/-----END CERTIFICATE-----/ { // { x; s/$/./; x; }; x; /.../ { x; p; x; }; x; }' filename
那是
/-----BEGIN CERTIFICATE----/,/-----END CERTIFICATE-----/ {
// {
x
s/$/./ # keep a counter of boundary lines in the hold buffer
x
}
x # inspect the counter
/.../ { # if counter >= 3
x
p # print the line
x
}
x
} # with -n, falling off the end here will not lead to printing.
另外,我能想到的最聰明的awk
awk '/----BEGIN CERTIFICATE----/ { flag = 1; ++ctr } flag && ctr >= 2 { print } /-----END CERTIFICATE-----/ { flag = 0 }' filename
更容易理解的是:
/----BEGIN CERTIFICATE----/ { # beginning of a range:
flag = 1 # raise flag that we're in one
++ctr # count in which one
}
flag && ctr >= 2 { print } # print only if in a range and not in the first
/-----END CERTIFICATE-----/ { # when leaving
flag = 0 # lower flag
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.