【问题标题】:AWK match exact string inside square bracketsAWK 匹配方括号内的精确字符串
【发布时间】:2020-12-25 13:58:14
【问题描述】:

我有一个类似于下图数据的文件。

https://www.test.example.com [503]
https://www.tst.example.com [403]
https://www.tt.example.com [302]

我想获取与第二列匹配的行。例如,匹配 [403] 的行应该只打印https://www.tst.example.com

我尝试使用以下命令转义方括号,这给了我一个警告。

$ awk -F "$2 == '\[403]\'" file.txt
awk: warning: escape sequence `\[' treated as plain `['
awk: warning: escape sequence `\'' treated as plain `''

【问题讨论】:

  • 我回滚了您的最新编辑。在收到几个答案后从根本上改变问题是不可接受的;除了不公平地移动到球门柱之外,它会使这些答案无效并使新访客感到困惑。相反,(在此处接受其中一个答案,或者提交您自己的答案并接受,如果您愿意,并且)提出一个新问题,并预先明确说明要求。 (可能要注意解释您如何表示任何控制字符,例如文字转义字符。)

标签: shell awk


【解决方案1】:

您正在混合正则表达式和纯字符串。 [ 是一个正则表达式特殊字符,但您在这里没有使用正则表达式,只是一个文字字符串比较。您根本不需要任何转义(尽管为了简单起见,您可能希望颠倒单引号和双引号的用法,除非您实际使用的是 Windows)。

awk '$2 == "[403]"' file.txt

在基本上所有的 Unix shell 中,你使用的双引号不保护美元符号,所以 $2 将被 shell 替换,可能没有任何内容,或者用一些不相关的字符串(无论作为shell 的第二个命令行参数)。

-F 选项(如果存在)需要一个参数;但根据您的示例数据,默认字段分隔符 - 任何空格序列 - 应该可以正常工作。如果你想强迫它例如一个空格,试试-F ' '

【讨论】:

    【解决方案2】:

    您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。

    awk -F'([[:space:]]*)?\\[|\\]([[:space:]]*)?' '$2=="403"{print $1}' Input_file
    

    说明: 将所有行的字段分隔符设置为空格(可选)[ 或 [空格(可选)。然后检查第二个字段是否为403,然后根据 OP 的请求打印第一个字段。

    【讨论】:

    • ITYM -F'([[:space:]]*\\[)|(][[:space:]]*)'
    • @EdMorton,圣诞快乐先生,谢谢你一直指导上帝保佑你欢呼:)
    • 祝你圣诞快乐,新年快乐(或我们苏格兰人所说的 Guid Hogmanay)!
    【解决方案3】:

    会做你想做的事,好处是允许你将所需的代码作为参数传递,而不是将其硬编码到 awk 脚本中。

    awk -v http_code=403 '$2 == "["http_code"]"' file.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多