Как сделать grep на удаленной машине и распечатать строку, которая содержит те слова?

Можно использовать ${#VAR} получить длину переменной $VAR:

if [ "${#filename}" -eq 5 ]; then
   rename_file
fi
3
12.10.2014, 03:03
3 ответа

Если вы открыты для других форматов, рассмотрите:

inc="hello|animal|atttribute|metadata"
exc="timeout|runner" 
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"

Быстрая альтернатива

Если ваши лог-файлы большие и вы смазываете их фиксированными словами, в отличие от причудливых регулярных выражений, вы можете рассмотреть такой подход:

inc='hello
animal
atttribute
metadata'

exc='timeout
runner'

ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"

Поместив каждое слово в отдельную строку, мы можем использовать функцию grep'а -F для фиксированных строк. Это отключает обработку регексов, делая процесс более быстрым.

8
27.01.2020, 21:09

Это может показаться невозможным, но вы можете использовать параметр -f в grep этого списка слов, даже если они находятся в переменной среды, а не в собственном файле. Хитрость заключается в том, чтобы обмануть grep , заставив думать, что они взяты из такого файла:

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'

Это запустит команду grep ... удаленно через ssh на машине B. Он возьмет вашу переменную $ wordsToInclude и переключит запятые на символы конца строки, (, -> \ n ). Этот список слов затем передается в grep через его переключатель -f .

Чтобы пропустить это через список исключений, просто добавьте это как второй grep после начального через канал.

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \
    file1 file2 file3 | grep -vf <(echo $wordsToExclude)'
2
27.01.2020, 21:09

SSH запускается такой командой:

ssh host command

Или в вашем случае:

ssh -t machineB "grep -E \"$wordsToInclude\" ptd.log | grep -v \"$wordsToExclude\""

-tпредотвращает "ошибку ioctl". Я бы также рекомендовал использовать фиксированные слова grep для увеличения скорости, как указано в этом ответе от @John1024. Просто поместите каждое слово в отдельную строку, например:

wordsToInclude='hello
animal
atttribute
metadata'

wordsToExclude='timeout
runner'

И добавьте -Fв опции grep.

1
27.01.2020, 21:09

Теги

Похожие вопросы