簡體   English   中英

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}'

我想獲得第二個結果,而只用兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM