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