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



我使用jq来解析json文件到文本,反之亦然,在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[3gru001bH            u001bH            u001bH              u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bH            u001bHrdefault",
  "dev-external",
  "my-sg"
]

请帮助。谢谢你。

jq手册页,这些选项之一似乎很有帮助:

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

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

  • ——ascii-output/-a:

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

(张贴作为一个答案,即使它更像评论,因为它太长了,将不可读的评论-它甚至可能是正确的…)

让我感到困惑的是非ascii 字符,但我能够使它在awk &sed通过复制/粘贴到以下字符:

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 '/^342200224/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
  "default",
  "dev-external",
  "my-sg"
]

(使用 od 和"试错"找到的数字)

最新更新