我使用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
和"试错"找到的数字)