使用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参数出现的种种谜团的主要内容,如果未能解决你的问题,请参考以下文章

使用grep搜索BASH历史记录

如何使用 grep 命令将 docker 日志重定向到文本文件? [复制]

Linux find 和 grep 命令一起使用

使用grep在''之间获取多个单词并操纵它们

text 使用grep递归搜索字符串

markdown Grep使用