一、简介
我们经常会在shell脚本中见到如下命令:"ps -ef | grep test_sever | grep -v grep | wc -l",各子命令其作用如下
- ps -ef 指令用来查询所有进程;
- grep test_server 通过管道来过滤指定 test_server 进程;
- grep -v 是反向查询的意思,即过滤出不包含 -v 参数后指定字符的信息;
- grep -v grep 的作用是即反向过滤除结果集中包含 grep 的项;
- wc -l 是统计结果的行数
整条指令的作用就是,过滤并统计包含 "test_server" 关键字的进程个数。那么这里会有很多人不太理解为什么需要去除包含 grep 的项,什么是包含 grep 的项???请继续往下看...
二、为什么需要"grep -v grep"
上面的指令在查找包含 "test_server" 关键字的相关进程时用到了 "grep" 命令,该命令执行的时候带有指定查找的进程参数即 "grep test_server",而查找进程的 "grep test_server" 调用本身也是一个进程,不太理解??继续往下看:
例如 这条命令前面的两个子部分:ps -ef | grep test_server 其实是分两步执行的
- 先执行 ps -ef 统计所有进程信息,"-e" 参数代表显示所有进程,"-f" 参数代表全格式;
- 再执行 grep test_server 这个命令过滤进程,该命令本身执行的时候也是一个进程,并也带有 test_server 关键字,所以其会出现在最后输出的进程信息里;
- 但是我们要查找的是 test_server 进程,显然上面的 grep test_server 进程并不是我们要找的进程,所以我们需要把 grep test_server 这个进程过滤掉,才是最后的结果;
怎么过滤呢,肯定不能再用 test_server 做关键字,而是要用 grep 做关键字进行反向过滤,即查找 test_server 进程的话需要按如下格式书写:
ps -ef | grep test_server | grep -v grep