【问题标题】:Counting process instances with grep & wc [duplicate]使用 grep 和 wc 计算流程实例 [重复]
【发布时间】:2018-07-30 18:58:39
【问题描述】:

我正在尝试使用以下命令计算流程实例:

$ ps -ef | grep "test.sh" | egrep -v "grep|vi|more|pg" | wc -l
1

这在命令行上完美运行,但在我将输出分配给变量时的脚本中:

script_instances=`ps -ef | grep "test.sh" | egrep -v "grep|vi|more|pg" | wc -l`
echo $script_instances

输出:

2

它以 1 递增,我不明白为什么会这样。

如果我只是在脚本中输入以下命令,它会正确打印

ps -ef | grep "test.sh" | egrep -v "grep"

输出:

root 14243 12162 0 19:12 pts/1 00:00:00 sh test.sh

我使用的是 Ubuntu 14.04.5 LTS

【问题讨论】:

  • 如果去掉wc -l,再看script_instances的内容,你看到了什么?
  • @BenjaminW。更新了我的问题
  • 理想情况下,根本不要使用ps | greppgrep 命令会执行上述操作,但也会天生避免匹配自身。
  • (如果您的目标是确保只有一个脚本实例,那么最可靠的方法是使用锁定文件;这样如果有人打开一个在您不知道的编辑器中创建文件并将其列入黑名单,或者是否有另一个同名脚本等)。

标签: bash grep ps wc


【解决方案1】:

以下修复了问题grep -cw "test.sh"

script_instances=`ps -ef | grep -cw "test.sh" | egrep -v "grep|vi|more|pg" | wc -l`

【讨论】:

    【解决方案2】:

    不要使用grep foo | grep -v grep,当shell 执行grep 时,它会被grep 处理,而是使用[ ] 来获取脚本名称的模式。

    $ ps -ef | grep -c '[te]st.sh'
    
    -c counts the number of matches
    

    【讨论】:

    • 你的意思是[t]est.sh[te]st.sh 仅匹配 tst.shest.sh(加上上面的任何变体,. 替换为另一个字符,因为它是正则表达式表示法中的通配符)。
    • ...实际上,test[.]sh 会是一个更好的位置 - 这样您就可以阻止 . 被视为通配符,防止从匹配自身开始。
    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2013-04-24
    • 2015-03-30
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多