概述:
有一个包含以下两行的文件
username=jsmith
api=2343234sdfkljasf
尝试运行以下AWK命令
awk -F= '$1=="username"||$1=="api"{print$2}' file.txt
尝试提取
jsmith
2343234sdfkljasf
问题:
==
。
awk -F= '$1="username"||$1="api"{print$2}' file.txt
==
https://tio.run/##Nck5CoAwEEDR3mMEWwudaaf1HikCZrKSRCzUqzsuYPPh8/TmRPqRSK3VlKiDUcfxvc5W7bnY2PrpFPmZuAbblu5hAgR07DxPwOjBvUEGj3yl3GyKVYaZbg 问题:
==
?jsmith
或2343234sdfkljasf
?答案 0 :(得分:2)
编辑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; dr:==
是正确的。
答案 1 :(得分:1)
尝试一下:
awk -F'=' '{gsub(/[[:space:]]/,"")} $1 == "username" || $1 == "api" { print $2; } ' file.txt
比较IS ==
或~
以使用正则表达式匹配的正确方法。
已分配=
,该条件将始终保留True
,因此无论如何都将print
。
您可能在该行中有空格,因此使==
的检查结果为false,请首先用gsub
删除这些空格。
另外,最好在代码中的元素之间添加 空格。
答案 2 :(得分:0)
您能否也请尝试以下操作。考虑到您可能不需要,我正在删除起始空间和结束空间。然后检查第一个字段是username
还是api
,然后打印该行的最后一个字段。
awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")} $1~/^username$|^api$/{print $NF}' Input_file
还是假设您的Input_file具有Control-M字符?(因为您的尝试对我来说效果很好,并且假设您的Input_file与所示示例相同)。通过进行cat -v Input_file
检查一次您是否拥有控制权(M),以防万一,然后可以尝试执行以下命令。
awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$|\r/,"")} $1~/^username$|^api$/{print $NF}' Input_file