如何摆脱使用gawk / awk和jq时打印的不需要的ANSI转义字符?

时间:2016-08-12 21:10:16

标签: awk gawk jq

我正在使用jq将bson文件解析为文本,反之亦然。在bash脚本中。

我在尝试逐行解析文本文件时遇到了这个问题,使其成为json对象。

这是我的输入文件:

default
———————————
out           0-65535  0.0.0.0/0          -1  
in            80       0.0.0.0/0          tcp 
in            8080     0.0.0.0/0          tcp 
in            21017    192.168.1.0/32     tcp 
in            2379     0.0.0.0/0          udp 
in            0-65535  sg-10fa3c75        -1  
===========
dev-external
———————————
out           0-65535  4.1.0.0/32         -1  
in            1-2      sg-10fa3c75        -1  
in            21034    sg-10fa3c75        tcp 
in            9418     24.115.129.102/32  tcp 
in            80       0.0.0.0/0          tcp 
in            8080     default            tcp 
in            21017    192.168.1.0/0      tcp 
in            123-655  1.45.9.1/32        -1  
===========
my-sg
———————————
out           0-65535  0.0.0.0/0          -1  
in            80       0.0.0.0/0          tcp 
in            8070     0.0.0.0/0          tcp 
in            8080     0.0.0.0/0          tcp 
in            21017    192.168.1.0/32     tcp 
in            0-65535  sg-10fa3c75        -1  
===========

我尝试使用gawk解析此文件:

gawk 'BEGIN{RS="\n=+\n"; FS="\n"; ORS="\n"} { print $1 }'

返回:

default                                                                                                                                                                             
dev-external
my-sg

但是当我使用jq解析它时:

| jq -R . | jq -s .

我附上了这些不需要的转义字符。

[
  "\u001b[3g\r\u001bH            \u001bH            \u001bH              \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH            \u001bH\rdefault",
  "dev-external",
  "my-sg"
]

请帮忙。 谢谢。

2 个答案:

答案 0 :(得分:1)

jq manual page开始,其中一个选项似乎有所帮助:

  
      
  • - color-output / -C和--monochrome-output / -M:
  •   
     

默认情况下,如果写入终端,jq会输出彩色JSON。您可以   即使使用写入管道或文件,也要强制它产生颜色   -C,并使用-M

禁用颜色      
      
  • - ascii-output / -a:
  •   
     

jq通常将非ASCII Unicode代码点输出为UTF-8,即使是   input将它们指定为转义序列(如“\ u03bc”)。用这个   选项,您可以强制jq生成每个纯ASCII输出   非ASCII字符替换为等效的转义序列。

(作为答案发布,即使它更多评论,因为它太长并且作为评论不可读 - 甚至可能是正确的......)

答案 1 :(得分:0)

令我感到困惑的是非ascii 字符,但我能够在awk& sed将char复制/粘贴到以下内容中:

awk '/^—/ {d=1} /^=/ {d=0; next} !d'
sed '/^—/,/^=/ d'

结果如下:

$ awk '/^—/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
  "default",
  "dev-external",
  "my-sg"
]
$ sed '/^—/,/^=/ d' esc.txt | jq -R . | jq -s
[
  "default",
  "dev-external",
  "my-sg"
]

如果我们想让我们更明显地尝试匹配非ascii字符,我们可以利用awk中的功能来匹配字符的八进制表示:

$ awk '/^\342\200\224/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
  "default",
  "dev-external",
  "my-sg"
]

(使用 od 和“反复试验”找到的数字。)