如何在子外壳中使用 grep 命令



我想通过 bashscript 连接到 4 台服务器,并在每台服务器上执行一些命令。命令的输出应保存在本地变量中。所以我尝试了这种代码的平静。

我已经尝试了几件事。当我只是执行"ls"或其他东西时,我得到了正确的结果。只有使用 zgrep/grep 它才能像预期的那样工作。脚本在第 4 个回声后停止。所以看起来 grep 命令有任何问题,但我不知道是什么。

for node in $(echo $nodes | sed "s/,/ /g")
do
    echo "############################"
    echo "Searching in Node: $node"
    echo "Searching in file(s) of pattern: $FILENAME"
    echo "Searching for string: $SEARCH_STRING"
    OUT=$(ssh -t -v $user@$node "cd $TESA_LOG_DIR; zgrep $SEARCH_STRING $FILENAME")
    echo $OUT
done

我们不知道这些变量设置了什么;但是传入空的搜索字符串或文件名会产生您描述的症状。

实际上,正确引用变量可以修复这个符号,并提高健壮性,尽管显然我们无法知道是什么原因导致这些变量首先为空。

此外,应避免使用大写变量名称,因为这些名称是为系统使用保留的。

这是一个重构,希望能帮助您找到根本原因并修复一些样式问题。我添加了一些内联评论。

# This is still problematic.
# How is $nodes initialized?
# Maybe use an array instead
for node in $(echo "$nodes" | sed "s/,/ /g")
do
    # Massive verbosity removed
    # Avoid useless variable
    # Avoid cd
    ssh -t -v "$user@$node" zgrep "$SEARCH_STRING" "$TESA_LOG_DIR/$FILENAME"
done

最新更新