UNIX-Mac上的awk用法不起作用,但在线资源可以

时间:2019-03-14 01:11:13

标签: unix awk

概述:

  • 运行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
    

问题:

问题:

  • 哪种语法是正确的,因为到处都是==
  • 您如何获得jsmith2343234sdfkljasf

3 个答案:

答案 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