如何摆脱使用 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.
(作为答案发布,尽管它更像是评论,因为它太长并且作为评论不可读 - 它甚至可能是正确的...)
我正在使用 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.
(作为答案发布,尽管它更像是评论,因为它太长并且作为评论不可读 - 它甚至可能是正确的...)