在 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
元字符的支持。
我想找到 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
元字符的支持。