Можно использовать ${#VAR}
получить длину переменной $VAR
:
if [ "${#filename}" -eq 5 ]; then
rename_file
fi
Если вы открыты для других форматов, рассмотрите:
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
для фиксированных строк. Это отключает обработку регексов, делая процесс более быстрым.
Это может показаться невозможным, но вы можете использовать параметр -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)'
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.