【问题标题】:awk prints $2 to what I expect, but when I compare $2's value to same it returns falseawk 将 $2 打印到我期望的值,但是当我将 $2 的值与相同的值进行比较时,它返回 false
【发布时间】:2021-12-30 01:07:10
【问题描述】:

当我发出以下命令时 -

ip -br -c addr show | awk '{print $2}'

它返回类似这样的输出 -

UNKNOWN
UP
DOWN
UP
UP
UP
UP

但是当我只想打印那些 UP 并且我说 -

ip -br -c addr show | awk '$2 == "UP"'

它不返回任何东西。 我已经将 awk 用于此类比较并且它有效,在这里我想知道 -br 可能不会返回可比较的字符串。还是我做错了什么。

【问题讨论】:

  • @CarlosPascual,恕我直言,这不起作用(至少对我来说,当我在我的 Ubuntu 20 测试 aws 框中测试时),原因是命令输出中有一些控制字符。
  • @CarlosPascual UNKNOWN 未着色。

标签: awk ip ifconfig


【解决方案1】:

使用您展示的示例,请尝试遵循 GNU grep 代码。

ip -br -c addr show | grep -oP '^\S+[^A-Z]+UP\D+.*?\K(\d+\.){3}\d+'

解释: 简单的解释是,运行ip -br -c addr show 命令并将其输出作为标准输入发送到grep 命令。在 GNU grep 代码中使用 oP 选项仅打印匹配的值并启用 PCRE 正则表达式引擎。在主程序中提到正则表达式(其解释在下面添加)并仅打印匹配的部分。

正则表达式的解释:

^\S+[^A-Z]+UP\D+.*? ##Matching non-spaces from starting of line followed by non-alphabets followed by UP followed by NON-DIGITS(1 or more occurrences) followed by a lazy match of next pattern.
\K                  ##\K will forget the previous matched value and will print only further mentioned regex value.
(\d+\.){3}\d+       ##Matching digits(1 or more occurrences) followed by a dot and matching this group 3 times followed by 1 or more occurrences of digits.

【讨论】:

    【解决方案2】:

    该命令也打印颜色,您可以使用以下命令查看非打印字符:

    ip -br -c addr show | cat -v
    

    如果您想保留颜色,另一种选择是使用index() 来检查UP

    ip -br -c addr show | awk  'index($2, "UP")'
    

    【讨论】:

      【解决方案3】:

      这是因为您告诉ip 命令使用-c option 将颜色代码添加到您的输出中:

      -c[color][={always|auto|never}
      配置颜色输出。

      删除-cip -br addr show | awk '$2 == "UP"' 将起作用。

      或者,您可以匹配绿色代码:

      ip -br -c addr show | awk  '$2 == "\033[32mUP"'
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多