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

How do I get rid of unwanted ANSI escape characters printed when using gawk / awk and jq?

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

我在尝试逐行解析文本文件以使其成为 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 }'

其中 returns :

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"
]

请帮忙。 谢谢。

让我感到困惑的是非 ascii 字符,但我能够通过 copy/pasting 字符使其在 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 '/^204/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
  "default",
  "dev-external",
  "my-sg"
]

(使用 od 和"trial and error."找到的数字)

来自 jq manual page,以下选项之一似乎有帮助:

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

By default, jq outputs colored JSON if writing to a terminal. You can force it to produce color even if writing to a pipe or a file using -C, and disable color with -M.

  • --ascii-output / -a:

jq usually outputs non-ASCII Unicode codepoints as UTF-8, even if the input specified them as escape sequences (like “\u03bc”). Using this option, you can force jq to produce pure ASCII output with every non-ASCII character replaced with the equivalent escape sequence.

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