Я хочу извлечь соответствующие строки из SNMP-логера в режиме реального времени и переместить их на мой сервер приложений для проверки. Вторая половина в порядке, scp
она делает свое дело. Первая половина вызывает у меня некоторые огорчения.
Я хочу проверить три последних файла журнала на наличие соответствующих сообщений. Поэтому я бы сделал:
[user@SNMPServer]$ cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files
trap.csv trap.csv.2019-05-31_07_00_01 trap.csv.2019-05-31_06_00_01
И это здорово, потому что затем я планирую:
[user@SNMPServer]$ grep $ipAddress $files
Опять же, все отлично работает, когда я запускаю его на SNMP-сервере.
Когда я делаю это из своей виртуальной машины, однако,
admin@alarmux:~$sudo ssh [email protected] "cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files"
Я получаю такой вывод:
assets bash: testerlog: command not found bash: count.txt: command not found
Это ls -t
результаты из домашнего каталога моей виртуальной машины, а не удаленного. Я где-то пропустил символы экранирования?
решение1
Обратные кавычки и $( … )
интерполяция внутри двойных кавычек. Используйте одинарные кавычки, и это сработает.
sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'
Или вообще избегайте подоболочки с помощью xargs:
sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress
решение2
С помощью zsh
оболочки три файла с самой последней меткой времени изменения, с совпадающими именами файлов *trap.cvs
в /var/opt/OV/log/nnm
каталоге, будут иметь шаблон
/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])
где (...)
изменяет поведение предыдущего шаблона. .
выбирает только обычные файлы (не имена каталогов и т. д.) и om
упорядочивает по убыванию временной метки модификации. [1,3]
Возвращает только первые три совпадения (или меньше, если совпадений меньше).
Итак, если у вас zsh
установлена оболочка на удаленной машине, вы сможете сделать следующее:
ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"
Это запустит grep
поиск IP-адреса, хранящегося $ipAddress
в трех последних измененных файлах на удаленной системе.
Флаги, используемые с , grep
заставляют его использовать сравнение строк, а не сопоставление с регулярными выражениями (то есть -F
), и требуют, чтобы совпадающая строка была полным словом (то есть -w
; , поэтому оно 123.123.123.123
не сопоставляется с 23.123.123.1
).