一般来说,要grep一个ps输出的进程,会同时输出grep的进程:
- [libgcc@10.36.159.37]~>$ ps -ef|grep crond
- root 3343 1 0 Aug07 ? 00:00:00 crond
- libgcc 4907 9805 0 18:23 pts/2 00:00:00 grep crond
然后,我们可以使用[]来去掉这个进程:
- [libgcc@10.36.159.37]~>$ ps -ef|grep cron[d]
- root 3343 1 0 Aug07 ? 00:00:00 crond
这个原理应该很容易理解,grep识别[]把它当作regex理解,在这里它只括了一个符号在regex理解是没啥意义的,但它改变了grep的命令行,所以可以过滤掉.
但是,这并不是每次都有效.比如如果你当前目录下有个文件叫crond:
- [libgcc@10.36.159.37]~/hh>$ ll
- total 0
- [libgcc@10.36.159.37]~/hh>$ touch crond
- [libgcc@10.36.159.37]~/hh>$ ll
- total 0
- -rw-r--r-- 1 libgcc work 0 Aug 23 18:24 crond
- [libgcc@10.36.159.37]~/hh>$ ps -ef|grep cron[d]
- root 3343 1 0 Aug07 ? 00:00:00 crond
- libgcc 5348 9805 0 18:24 pts/2 00:00:00 grep crond
你会发现,这个玩法失效了.为什么呢.因为bash也懂[].如果能匹配当前目录下的某个文件,它就会返回匹配的文件名.如果没办法匹配,那就按原字符串返回.我们可以用echo看一下
- [libgcc@10.36.159.37]~/hh>$ echo cron[d]
- crond
- [libgcc@10.36.159.37]~/hh>$ echo cron[t]
- cron[t]
本地目录只有crond这个文件,所以匹配和不匹配bash传给echo的参数是不一样的.如果传给grep的没有[]这个东西,就没办法过滤掉了.当然,我们可以加上引号来限制bash自已的扩展:
- [libgcc@10.36.159.37]~/hh>$ ps -ef|grep cron[d]
- root 3343 1 0 Aug07 ? 00:00:00 crond
- libgcc 6439 9805 0 18:27 pts/2 00:00:00 grep crond
- [libgcc@10.36.159.37]~/hh>$ ps -ef|grep 'cron[d]'
- root 3343 1 0 Aug07 ? 00:00:00 crond
当然,用双引号也是可以的.如果不想用引号,那么可以使用regex懂的但bash不懂的元字符来过滤:
- [libgcc@10.36.159.37]~/hh>$ ps -ef|grep crond$
- root 3343 1 0 Aug07 ? 00:00:00 crond
但这就要求crond必须是结尾的几个字符了
浙公网安备 33010602011771号