为什么匹配后有三个换行符(二进制为0a)?

时间:2018-02-04 09:26:45

标签: awk

~$ string="221.11.165.237xxxx221.11.165.233\n
219.158.9.97ttttt219.158.19.137"
~$ echo $string > /tmp/test.txt

现在检查二进制的真实字符串。

~$ xxd  /tmp/test.txt
00000000: 3232 312e 3131 2e31 3635 2e32 3337 7878  221.11.165.237xx
00000010: 7878 3232 312e 3131 2e31 3635 2e32 3333  xx221.11.165.233
00000020: 5c6e 2032 3139 2e31 3538 2e39 2e39 3774  \n 219.158.9.97t
00000030: 7474 7474 3231 392e 3135 382e 3139 2e31  tttt219.158.19.1
00000040: 3337 0a                                  37

我们在字符串末尾只能看到一个0a 用ip地址分割字符串

~$  echo "$string" | awk -v RS='([0-9]+\\.){3}[0-9]+' '{print $0}' > /tmp/test1.txt


~$ xxd  /tmp/test1.txt
00000000: 0a78 7878 780a 5c6e 0a0a 7474 7474 740a  .xxxx.\n..ttttt.
00000010: 0a0a 

为什么文件末尾有三个换行符0a? 在我的观察中,最后可能有两个换行符0a,一个是前一个,另一个是由awk中的print函数创建的,这导致第三个0a? 为什么结果不是以下:

~$ xxd  /tmp/test1.txt
00000000: 0a78 7878 780a 5c6e 0a0a 7474 7474 740a  .xxxx.\n..ttttt.
00000010: 0a
                                ..

观看屏幕截图更为清晰。

enter image description here

1 个答案:

答案 0 :(得分:1)

您正在添加3个新行

字符串中的

1) - 删除\n

2) echo - 默认添加新行 - 使用echo -n

3) awk print - 使用printf %s

删除换行符后

  set string="221.11.165.237xxxx221.11.165.233" ;
  echo -n "$string" | awk -v RS='([0-9]+\\.){3}[0-9]+' '{printf "%s", $0}'