使用grep -c参数出现的种种谜团

举报
互联网老辛 发表于 2022/08/14 22:08:43 2022/08/14
【摘要】 起因 一学员咨询脚本问题: 这个脚本中出现了grep -c 参数 我们都知道-c表示统计符合条件的行数,看逻辑没有问题,但实际运行会有一些出入。 源文件: #!/bin/bash # 用于判断某...

起因

一学员咨询脚本问题:
在这里插入图片描述
这个脚本中出现了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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果
在这里插入图片描述

但你把命令单独拿出来又是另外一个结果:

[root@laoxin-06 ~]# ps -ef|grep sshd | grep -vc grep
1

  
 
  • 1
  • 2

问题原因

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)

总结

很多时候我翻译过来的命令解释在实际使用中会有出入,这时候就需要我们去反复测试,除了用替代方案之外,也要找到问题的原因。

文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。

原文链接:zmedu.blog.csdn.net/article/details/126327973

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。