Как использовать команду grep в подоболочке?

Я хочу подключиться к 4 серверам через bashscript и выполнить на каждом сервере несколько команд. Вывод команд должен быть сохранен в переменной локально. Так что я попробовал этот мир кода.

Я уже попробовал несколько вещей. Когда я просто выполняю "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

1 ответ

Мы понятия не имеем, для чего установлены эти переменные; но передача пустой строки поиска или имени файла вызовет описанный вами симптом.

На самом деле, правильное цитирование ваших переменных исправит этот симптом и улучшит надежность, хотя, очевидно, мы не можем знать, что приводит к тому, что эти переменные будут пустыми.

Кроме того, вы должны избегать использования имен переменных в верхнем регистре, так как они зарезервированы для системного использования.

Вот рефакторинг, который, мы надеемся, поможет вам найти причину и исправить некоторые стилистические проблемы. Я добавил несколько встроенных комментариев.

# 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
Другие вопросы по тегам