grep
grep -v 筛除字符串
grep 通常用来过滤匹配的字符串,加 -v
参数能删除匹配的字符串。
grep 不列出自身进程
# 通常 grep 会把自身进程也给列出来
$ ps -ef | grep echo
501 93992 92583 0 12:29上午 ttys007 0:00.00 grep --color=auto echo
# 首字母加上 [] 就可以避免这种情况。
# 这是一个小技巧,其实这是正则表达式,[e] 相当于 e,但是 grep [e]cho 进程的命令已经被方括号分隔了,因此不会被 grep 匹配。
$ ps -ef | grep [e]cho
grep 返回 141 退出码
看起来命令挺正常的,但实际却是 141 退出码。实际是因为上一个命令还在 pipe,而下一个命令结束了,但上一个命令没地方去写了,这是内核会向上一个命令发送 SIGPIPE
信号,上一个命令被终止并返回了 141 退出码。
具体看这个答案,回答举的例子是 head
,同理。
提取匹配的字符串
msg='Sep 6 22:19:29 192 com.apple.xpc.launchd[1] (com.apple.cloudd): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.'
echo "$msg" | grep -Eo 'for .+? seconds'
-E
代表使用 extended 正则表达式,-o
代表只输出匹配的部分。 .+?
代表非贪婪匹配任意字符。
也可以匹配多个,比如 echo "$msg" | grep -Eo '(for .+? seconds|by .+? seconds)'