在 Mac 终端中一起使用 lsof 和 awk 的奇怪行为?

Strange behavior using lsof and awk together in Mac terminal?

我想找到 lsof 中所有包含 "Google" 的行,所以我尝试了以下操作:

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

这会正确地生成包含以单词 "google" 开头的行的输出。

但是,然后我尝试了这个,但 csv 什么都不包含:

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

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

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

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

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

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

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

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