概述:
- 运行 macOS Mojave 10.14.3 和 RHEL 7.6
- macOS 上的 awk 版本 20070501 和 RHEL 7.6 上的 GNU Awk 4.0.2
-
有一个包含以下两行的文件
username=jsmith api=2343234sdfkljasf
-
尝试运行以下 AWK 命令
awk -F= '$1=="username"||$1=="api"{print$2}' file.txt
-
尝试提取
jsmith 2343234sdfkljasf
问题:
- 尝试在macOS或RHEL 7.6上运行它,它不返回任何内容。
- 经过一些故障排除,我发现双 == 应该是 =,但我看到 awk 使用的任何地方,他们都在他们的示例中使用
==
。awk -F= '$1="username"||$1="api"{print$2}' file.txt
- 使用在线工具,它确实适用于
==
https://tio.run/##Nck5CoAwEEDR3mMEWwudaaf1HikCZrKSRCzUqzsuYPPh8/TmRPqRSK3VlKiDUcfxvc5W7bnY2PrpFPmZuAbblu5hAgR07DxPwOjBvUEGj3yl3GyKVYaZbg
问题:
- 哪种语法是正确的,因为语法到处都是
==
的? - 你如何获得
jsmith
或2343234sdfkljasf
?
稍微编辑一下file
以更具描述性:
$ cat file
username=user1
api=pass1
username=user2
api =pass2
请注意添加到记录 3 和 4 的 2 个空格。首先是==
:
$ awk -F= '$1=="username"||$1=="api"{print$2}' file
user1
pass1
仅匹配记录 1 和 2。现在,如果你使用=
,你没有匹配任何东西,而是设置$1
:
$ awk -F= '$1="username"||$1=="api"{print$2}' file
user1
pass1
user2
pass2
您设置的是:
$ awk -F= '$1="username"||$1=="api"{print $1,$2}' file
1 user1
1 pass1
1 user2
1 pass2
Tl;大卫:==
是正确的。
试试这个:
awk -F'=' '{gsub(/[[:space:]]/,"")} $1 == "username" || $1 == "api" { print $2; } ' file.txt
比较的正确方法是==
,或者~
使用正则表达式匹配。=
分配,那将始终将条件留给True
,因此无论如何都会print
。
您可能在行中有空格,因此==
检查为假,请先通过gsub
删除这些空格。
此外,最好在代码中的元素之间添加空格。
您能否也尝试以下。考虑到您可能不需要它,我正在删除行中的起始空间和结束空间。然后检查第一个字段是username
还是api
然后打印该行的最后一个字段。
awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")} $1~/^username$|^api$/{print $NF}' Input_file
或者假设您的Input_file具有 Control-M 字符?因为您的尝试对我来说效果很好,并且假设您的Input_file与所示示例相同)。检查一次您是否有控制 M(s),如果您拥有它们,请执行cat -v Input_file
然后您可以尝试以下命令。
awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$|r/,"")} $1~/^username$|^api$/{print $NF}' Input_file