【问题标题】:awk regex word boundaryawk 正则表达式单词边界
【发布时间】:2018-11-21 17:22:29
【问题描述】:

我有两台 Linux 机器。一个是 4.4.12-99,一个是 4.4.143。我刚刚对它们都进行了 apt upgrade 。

我有一个 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 地址匹配。

我不知道我做错了什么。

【问题讨论】:

  • 您运行它的示例文件是什么?给我们一个适当的可重现的例子来帮助我们解决您的问题
  • 您好,示例文件是 /etc/hosts 文件,如 awk 语句末尾所示,再次,如前所述,此 awk 查找 /etc/hosts 文件并提取给定用户名/主机名的 IP 地址。
  • @WesZ,你之前的帖子stackoverflow.com/questions/53353494/… 有什么不同请告诉我们?那个帖子你也没有告诉任何人发生了什么,所以请不要这样做,只回答问题/问题
  • 它说:谢谢。你好。我想发布提供正确输出的最后一行代码。我感谢那些做出回应的人的所有帮助和指导。我想发布最终代码,以防将来有人发现它有用。
  • 内核版本与您运行的 awk 版本完全无关。内核版本不是识别机器的可靠方法,因为您可能会不时执行更新。

标签: regex bash awk match


【解决方案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

【讨论】:

  • 空白是你的朋友。缩进解决了很多调试,lol
  • 嗨格伦 - 我使用了这个代码,我的症状是一样的。实际上,我已经尝试在 5 台不同的机器上使用这个“awk”语句,其中 4 台没有用,1 台用了。它适用于它一直有效的那个。您认为可能缺少图书馆或其他东西吗?也许我应该尝试重新安装 awk/mawk/gawk ??我真的对此感到困惑。我检查了系统日志,它什么也没报告。
  • 我确实注意到单词边界是 GNU awk 的一个特性。在某些发行版上默认没有安装 GNU awk:你运行的是什么 awk?并且不会记录 awk 错误。
  • 嗯......似乎“休斯顿......我们有一个问题......”运行良好的是GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1。 4, GNU MP 6.1.0) 有问题的是 awk: not an option: --version awk -Wversion 2>/dev/null || awk --version mawk 1.3.3 Nov 1996,版权所有 (C) Michael D. Brennan 那么我该怎么办?
  • 那么是不是需要安装 gawk 才能获得 GNU 的东西?
【解决方案2】:

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

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

-s files 告诉 getent 只使用本地主机数据库(不是 DNS),即 /etc/hosts

【讨论】:

  • 你好,这个getent可以用,但是可以让它使用指定的文件吗?我查看了手册页,但没有提及。我可以使用它,我需要重新编写一些代码来附加 /etc/hosts 文件。如果可以的话,我想使用 awk 代码,尽管它变得有点笨拙......所以也许这是一个更好的解决方案。谢谢。
  • getent hosts 始终使用/etc/hosts。您基本上想要做的是本地主机名查找。 getent -s files 就是为此而生的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2011-03-28
  • 2014-06-07
  • 2012-09-24
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
相关资源
最近更新 更多