如何在子Shell中使用grep命令?

时间:2019-01-05 12:33:01

标签: bash ssh grep subshell

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

我已经尝试了几种方法。当我只执行“ ls”或其他命令时,我得到正确的结果。仅使用zgrep / grep不能正常工作。脚本在第四个回显之后停止。因此,看来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

1 个答案:

答案 0 :(得分:2)

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

实际上,正确地引用变量可以修复此症状并提高鲁棒性,尽管显然我们不知道是什么原因导致这些变量最初为空。

此外,您应避免使用大写的变量名,因为这些变量名仅供系统使用。

这里是重构,希望可以帮助您找到根本原因并解决某些样式问题。我添加了一些嵌入式注释。

# 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