使用grep -c参数出现的种种谜团
Posted 互联网老辛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用grep -c参数出现的种种谜团相关的知识,希望对你有一定的参考价值。
起因
一学员咨询脚本问题:
这个脚本中出现了grep -c 参数
我们都知道-c表示统计符合条件的行数,看逻辑没有问题,但实际运行会有一些出入。
源文件:
#!/bin/bash
# 用于判断某个进程是否存在
#NAME=/usr/sbin/sshd #NAME:进程的唯一判断标识
NAME=$1
NUM=$(ps -ef|grep $NAME | grep -vc grep)
echo $NUM
if [ $NUM -eq 1 ];then
echo -e "\\033[32m$NAME is running.\\033[0m"
elif [ $NUM -gt 1 ];then
echo -e "\\033[31m存在重复的$NAME进程,请检查!\\033[0m"
else
echo -e "\\033[33m$NAME is not running.\\033[0m"
fi
执行结果
但你把命令单独拿出来又是另外一个结果:
[root@laoxin-06 ~]# ps -ef|grep sshd | grep -vc grep
1
问题原因
grep -c 参数统计的是符合条件的行不假,但他会把后面执行的命令一并算进去。
如果你的脚本名字是test.sh, 你需要在后面执行./test.sh sshd 所以把这个也提前给他去掉
当然这里的脚本名字可以用 $0替代
解决方案一:
把num的变量里加上去掉脚本本身
NUM=$(ps -ef|grep $NAME | grep -vc grep|grep -v test.sh)
但这种方式并不严谨,因为你的脚本名字不能一直叫test.sh, 所以这里可以改成 $0
NUM=$(ps -ef|grep $NAME | grep -vc grep|grep -v $0)
解决方案二:
不适用grep -c参数,而是用wc -l替代
wc -l 查询的是当下时刻
NUM=ps -ef|grep $NAME | grep -vc grep |wc -l
这种形式等同于:
NUM=$(ps -ef|grep $NAME | grep -vc grep |wc -l)
总结
很多时候我翻译过来的命令解释在实际使用中会有出入,这时候就需要我们去反复测试,除了用替代方案之外,也要找到问题的原因。
以上是关于使用grep -c参数出现的种种谜团的主要内容,如果未能解决你的问题,请参考以下文章