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

Hun*_*nle 2 regex macos awk lsof

我想在其中找到lsof"Google"中的所有行,所以我尝试了以下内容:

lsof |  awk '/.*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv
Run Code Online (Sandbox Code Playgroud)

这会正确地产生一个以"google"开头的行的输出.

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

lsof |  awk '/\s*google.*/ { print $1 "," $2 "," $3} ' > new_file.csv
Run Code Online (Sandbox Code Playgroud)

但是,我认为这\s*意味着任意数量的空间.这种行为有什么理由吗?谢谢.

Eta*_*ner 5

\s确实意味着空间并且\s*意味着零或多空间但不是awk.

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

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

如果你只是关心google在输出中那么你应该说/google/.

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

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