awk 正则表达式 字边界

Wes*_*esZ 2 regex bash awk match

我有两台 Linux 机器。一种是 4.4.12-99,一种是 4.4.143。我刚刚对它们都运行了 apt update 。

我有一个 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 )
Run Code Online (Sandbox Code Playgroud)

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

我不知道我做错了什么。

gle*_*man 5

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 
Run Code Online (Sandbox Code Playgroud)

(空白很好,你应该尝试使用它)


另一种方法是循环字段并使用字符串相等,它自动包含单词边界。这将与 gawk 或 mawk 一起使用

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