【问题标题】:Strange behavior using lsof and awk together in Mac terminal?在 Mac 终端中一起使用 lsof 和 awk 的奇怪行为?
【发布时间】:2015-06-29 22:28:49
【问题描述】:

我想在lsof 中找到所有带有“Google”的行,所以我尝试了以下方法:

lsof |  awk '/.*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv

正确地产生一个以“google”开头的行的输出。

但是,然后我尝试这个并且 csv 不包含任何内容:

lsof |  awk '/\s*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv

但是,我认为\s* 表示任意数量的空格。这种行为有什么原因吗?谢谢你。

【问题讨论】:

    标签: regex macos awk lsof


    【解决方案1】:

    \s 表示空格,\s* 表示零个或多个空格,但在 awk 中没有。

    awk 使用不同的(旧的)正则表达式引擎。

    对于 awk,您希望 [[:space:]]* 匹配零个或多个空格。 (这是字符列表[][:space:]的字符类。)

    也就是说,如果您只关心 google 在输出中,那么您只需要 /google/

    如果你想要一个单词锚定的google,那么你想要/\<google\>/

    正如 Ed Morton 所指出的,GNU Awk 4.0+ 版也增加了对 \s 元字符的支持。

    【讨论】:

    • \s 确实表示 GNU awk 中的任何空格字符。
    • 我尝试了lsof | gawk '/^\s*oogle/ { print $1 ", " $2 }',但它仍然没有返回任何内容。我查看了gawk 的手册页,它说^ 的意思是“字符串的开头”。
    • 什么版本的 gawk?你真的关心领先的空间吗?包含“google”的行真的以空格开头吗? /^\s*oogle/匹配其中包含“google”的行。它将匹配以零个或多个空格开头,然后立即包含“oogle”的行。
    • gawk 版本 4.1.3。前导空格是因为我希望它同时在 mac 终端和 cygwn 上运行。 Cygwin 有时会在输出行之前放置奇怪的空格(例如,在 netstat 中,它们会在输出之前放置空格)。另外,为了长期利益,我想了解它为什么不起作用。
    • 如果您的模式不寻找空格,那么它不关心空格。模式/google/ 将匹配 any 行中包含“google”的 anywhere 空格与否。不要过度指定你的匹配。如果你想要的只是一行上面写着“google”的somewhere,如果你想单独使用“google”作为一个词,请使用/google//\<google\>/。正如我在答案中解释的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多