【问题标题】:How to grep success in a for loop如何在for循环中grep成功
【发布时间】:2020-09-24 05:07:05
【问题描述】:

为此苦苦挣扎……

for i in `cat services.txt`
do
if ! grep -q $i; then
echo " $i Is NOT Running"
else
echo " Checking $i on `hostname`..."
ps aux | grep -i $i | awk '{print $1, $11}'| cut -d' ' -f1-2| sort
echo -e " "
sleep 4
fi
done

块只是挂起 - 我无法捕获 grep 的成功/失败

如果未找到 services.txt 中的字符串...脚本挂起...如果找不到,我希望 grep 跳过它

services.txt 只包含单个单词

谢谢!

【问题讨论】:

    标签: loops for-loop variables grep skip


    【解决方案1】:

    这是工作代码

    checkservices() {
    cat >$HOME/services.txt <<EOF
    ganglia
    hbase
    hdfs
    hive
    hue
    livy
    mapred
    test-missing-service
    mysql
    oozie
    presto
    spark
    yarn
    zeppelin
    EOF
    
    for i in `cat $HOME/services.txt`
    do 
    if `ps -ef  | grep ^$i | grep -v grep >/dev/null`
    then 
    i=$(echo "$i" | awk '{print toupper($0)}')
    echo "$i -- is running on `hostname`"
    echo ""
    sleep 2
    else 
    i=$(echo "$i" | awk '{print tolower($0)}')
    echo "$i -- IS NOT running on `hostname` error"
    echo ""
    fi
    done
    }
    

    【讨论】:

    • 通过shellcheck.net 运行它,它会告诉你它的一些问题。
    • Ed,非常感谢,这是一个很棒的工具和帮助。我是老(呃)学校,因为我的工作,所以从来没有对那些新方法感兴趣。但这解释了如何以及为什么要这样做。 .非常感谢
    【解决方案2】:

    您的脚本挂起的原因是因为命令grep -q $i 正在等待输入。您可以尝试在 shell 中单独运行该命令并验证它是否会提示输入。

    在 if 语句中将您的命令更改为 ps aux | grep -i $i 应该可以解决您的问题。

    注意:ps aux | grep -i $i 也将 grep 列为进程之一。确保通过管道将其排除在另一个 grep ps aux | grep -i $i | grep -v 'grep'

    【讨论】:

    • 感谢 Vijay - 我后来意识到,但这仍然具有挑战性 - 感谢您的时间和投入。我将在下面发布工作代码
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多