awk 仅打印两个模式之间的行,删除第一个匹配项
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}'
我想通过使用两个 awk 获得第二个结果,而不需要模式匹配之外的额外内容。
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
}
这一个打印在两个模式之间
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}'
我想通过使用两个 awk 获得第二个结果,而不需要模式匹配之外的额外内容。
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 -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
}