默认情况下,awk 将\n 视为记录分隔符。这使得计算\r\n\r\n 变得非常困难。如果我们选择其他一些记录分隔符,比如一个字母,那么我们可以很容易地统计这个组合的出现。因此:
awk '{n+=gsub("\r\n\r\n", "")} END{print n}' RS='a' file
这里,gsub 返回替换的次数。这些相加,在达到file 的末尾后,我们打印总数。
示例
在这里,我们使用 bash 的 $'...' 构造来显式添加换行符和换行符:
$ echo -n $'\r\n\r\n\r\n\r\na' | awk '{n+=gsub("\r\n\r\n", "")} END{print n}' RS='a'
2
替代解决方案 (GNU awk)
我们可以告诉它把\r\n\r\n当作记录分隔符,然后返回记录数的计数(减1):
cat file <(echo 1) | awk 'END{print NR-1;}' RS='\r\n\r\n'
在 awk 中,RS 是记录分隔符,NR 是记录数的计数。由于我们使用的是多字符记录分隔符,因此这需要 GNU awk。
如果文件以\r\n\r\n 结尾,则上述内容将减一。为避免这种情况,echo -n 1 语句用于确保文件中最后一个 \r\n\r\n 之后始终至少有一个字符。
示例
在这里,我们使用 bash 的 $'...' 构造来显式添加换行符和换行符:
$ echo -n $'abc\r\n\r\n' | cat - <(echo 1) | awk 'END{print NR-1;}' RS='\r\n\r\n'
1
$ echo -n $'abc\r\n\r\ndef' | cat - <(echo 1) | awk 'END{print NR-1;}' RS='\r\n\r\n'
1
$ echo -n $'\r\n\r\n\r\n\r\n' | cat - <(echo 1) | awk 'END{print NR-1;}' RS='\r\n\r\n'
2
$ echo -n $'1\r\n\r\n2\r\n\r\n3' | cat - <(echo 1) | awk 'END{print NR-1;}' RS='\r\n\r\n'
2