我有一个类似于下图数据的文件。
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 `''
您正在混合正则表达式和纯字符串。[
是一个regex特殊字符,但您在这里没有使用regex,只是一个文本字符串比较。您根本不需要任何转义(尽管为了简单起见,您可能希望颠倒单引号和双引号的使用,除非您实际使用的是Windows(。
awk '$2 == "[403]"' file.txt
在基本上所有的Unix shell中,您使用的双引号不保护美元符号,因此$2
将被shell替换,可能什么都没有,或者用一些不相关的字符串(作为shell的第二个命令行参数传入的任何字符串(。
-F
选项(如果存在(需要一个参数;但根据您的示例数据,默认的字段分隔符(任何空格序列(应该可以正常工作。如果你想把它强制到一个空间,试试-F ' '
。
您能尝试以下内容吗?这些内容是用GNUawk
中显示的示例编写和测试的。
awk -F'([[:space:]]*)?\[|\]([[:space:]]*)?' '$2=="403"{print $1}' Input_file
解释:将字段分隔符设置为所有行的空格(可选([OR[spaces(可选(。然后检查第二个字段是否为403
,然后根据OP的请求打印第一个字段。
将执行您想要的操作,其好处是允许您将所需的代码作为参数传递,而不是将其硬编码到awk脚本中。
awk -v http_code=403 '$2 == "["http_code"]"' file.txt