【问题标题】:How do I get rid of unwanted ANSI escape characters printed when using gawk / awk and jq?如何摆脱使用 gawk / awk 和 jq 时打印的不需要的 ANSI 转义字符?
【发布时间】:2016-08-12 21:10:15
【问题描述】:

我在 bash 脚本中使用 jq 将 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 $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"
]

请帮忙。 谢谢。

【问题讨论】:

    标签: awk gawk jq


    【解决方案1】:

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

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

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

    • --ascii-输出/-a:

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

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

    【讨论】:

      【解决方案2】:

      让我感到困惑的是非 ascii 字符,但我能够通过将字符复制/粘贴到以下内容中使其在 awksed 中工作:

      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 和“反复试验”找到的数字。)

      【讨论】:

        猜你喜欢
        • 2018-01-15
        • 2018-06-05
        • 2011-06-11
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        相关资源
        最近更新 更多