libgcc

导航

 

  一般来说,要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必须是结尾的几个字符了

posted on 2012-08-23 18:30  libgcc  阅读(1493)  评论(0)    收藏  举报