Как использовать команду 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

person xMaNuu    schedule 05.01.2019    source источник
comment
Чему соответствуют эти переменные? Остановка команды часто является признаком того, что вы передаете пустую переменную и не заключаете ее в кавычки должным образом (о чем достаточно свидетельствует здесь).   -  person tripleee    schedule 05.01.2019
comment
Не используйте прописные буквы для ваших личных переменных. Попробуйте shellcheck.net, прежде чем обращаться за помощью к человеку (хотя ни одна из ошибок не вызывает симптомов, с которыми вы обращаетесь за помощью) .   -  person tripleee    schedule 05.01.2019


Ответы (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
person tripleee    schedule 05.01.2019
comment
$(echo "$nodes" | sed "s/,/ /g") можно заменить на ${nodes//,/ } - person cdarke; 05.01.2019
comment
Да, но, как я сказал в комментарии, это, вероятно, следует полностью реорганизовать. - person tripleee; 05.01.2019