Mac 上的 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
    

问题:

  • 尝试在macOS或RHEL 7.6上运行它,它不返回任何内容。
  • 经过一些故障排除,我发现双 == 应该是 =,但我看到 awk 使用的任何地方,他们都在他们的示例中使用==
    • awk -F= '$1="username"||$1="api"{print$2}' file.txt
  • 使用在线工具,它确实适用于==https://tio.run/##Nck5CoAwEEDR3mMEWwudaaf1HikCZrKSRCzUqzsuYPPh8/TmRPqRSK3VlKiDUcfxvc5W7bnY2PrpFPmZuAbblu5hAgR07DxPwOjBvUEGj3yl3GyKVYaZbg

问题:

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

稍微编辑一下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

最新更新