awk regex单词边界

时间:2018-11-21 17:22:30

标签: regex bash awk match

我有两台Linux机器。一种是4.4.12-99,一种是4.4.143。我只是对它们都进行了升级。

我有一个awk语句,其中包含可在4.4.143上运行的正则表达式,但在4.4.12-99上失败。我已经搜索了几天,并尝试了多种不同的语法来发现可能出错的地方。 awk不会失败或抱怨,只是与单词边界不匹配。除了此awk语句外,每台计算机上的脚本均相同,并且可以正常工作。对于无法正常运行的软件,我可以使其匹配所有内容并提供结果。

ip=$(awk -v sUSER="$sUSER" 'BEGIN{gsub(/\./,"\\.",sUSER)}match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) && $0 ~ ("[^[:alnum:]]"sUSER"$") && $0 !~ /^$/ && $0 !~ /^#/{print $1}' /etc/hosts )

awk使用变量$ sUSER进入/ etc / hosts文件,并尝试将用户与关联的IP地址进行匹配。

我不知道自己在做什么错。

2 个答案:

答案 0 :(得分:1)

您基本上想要做的是本地主机名查找。为此,有一个名为getent的工具:

getent -s files hosts "${sUSER}" | cut -d' ' -f1

-s files告诉getent仅使用/etc/hosts的本地主机数据库(不是DNS)。

答案 1 :(得分:1)

hek2mgl的答案是您应该使用的。

对于您的awk问题,此处记录了GNU awk正则表达式:https://www.gnu.org/software/gnulib/manual/html_node/gnu_002dawk-regular-expression-syntax.html

他们将\<\>用作零宽度单词边界标记,因此您可以这样做

gawk -v sUSER="$sUSER" '
    BEGIN {
        gsub(/\./,"\\.",sUSER)
        ipv4Re = "^[0-9]+(\\.[0-9]+){3}$"
        sUserRe = "\\<" sUSER "\\>"
    }
    /^$/ || /^#/ {next}
    $1 ~ ipv4Re && $0 ~ sUserRe {print $1}
' /etc/hosts 

(空格很好,您应该尝试使用它)


另一种方法是遍历字段并使用自动包含单词边界的字符串相等性。这将适用于gawk或mawk

awk -v sUSER="$sUSER" '
    !/^#/ {for (i=2; i<=NF; i++) if ($i == sUSER) print $1}
' /etc/hosts