Как сделать grep на удаленном компьютере и распечатать строку, содержащую эти слова?

У меня есть несколько файлов журналов в моей machineB в этом каталоге /opt/ptd/Logs/ как показано ниже – Мои файлы журналов довольно большие.

 david@machineB:/opt/ptd/Logs$ ls -lt -rw-r--r-- 1 david david 49651720 Oct 11 16:23 ptd.log -rw-r--r-- 1 david david 104857728 Oct 10 07:55 ptd.log.1 -rw-r--r-- 1 david david 104857726 Oct 10 07:50 ptd.log.2 

Я пытаюсь написать общий сценарий оболочки, который должен попытаться проанализировать весь мой файл журнала в machineB для определенного шаблона и напечатать строку, которая имеет эти шаблоны. Я буду запускать свой ниже сценарий оболочки из machineA который имеет все ключи ssh, все, что мне нужно, чтобы удаленно grep на файлах журналов на machineB от machineA.

 #!/bin/bash wordsToInclude="hello,animal,atttribute,metadata" wordsToExclude="timeout,runner" # now grep on the various log file for above words and print out the lines accordingly - #!/bin/bash wordsToInclude="hello,animal,atttribute,metadata" wordsToExclude="timeout,runner" # now grep on the various log file for above words and print out the lines accordingly 

Значит, у меня будут слова, разделенные запятой в wordsToInclude Переменная wordsToInclude Если мои журналы содержат слово hello то распечатайте эту строку, также распечатайте строку, содержащую animal слово. Аналогично словам attribute и metadata .

А также у меня будут слова, разделенные запятыми wordsToExclude variable – Если какая-либо из строк содержит эти слова, то не распечатывайте эту строку.

На данный момент я собираюсь с указанным выше форматом для хранения слов, но любой лучший формат подходит для меня. Я могу иметь длинный список слов в wordsToInclude и wordsToExclude переменной, поэтому я собираюсь хранить их в этих переменных.

Я знаю, как сделать grep на небольшом наборе переменных. Если мне нужно сделать grep из командной строки непосредственно на machineB, тогда я сделаю это вот так:

 grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout' 

Но я не уверен, как мне объединить это в моем сценарии оболочки, чтобы я мог делать удаленный ssh ​​grep на machineB из machineA.

2 Solutions collect form web for “Как сделать grep на удаленном компьютере и распечатать строку, содержащую эти слова?”

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

 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 machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'" 

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

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

 inc='hello animal atttribute metadata' exc='timeout runner' ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'" - inc='hello animal atttribute metadata' exc='timeout runner' ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'" 

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

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

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

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

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

 $ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \ file1 file2 file3 | grep -vf <(echo $wordsToExclude)' 
  • зарегистрировать или ограничить исходный пользователь ssh login
  • ssh backspace не работает, пока я не запускаю вручную TERM = xterm
  • Учетные записи дросселя после неудачных попыток входа в систему SSH
  • Ограничить доступ ssh для каждого пользователя на основе условий
  • SSH автоматические удаленные резервные копии
  • Клиент Web ssh / telnet
  • Тайм-аут соединения SSH
  • Не удалось использовать ssh-copy-id - mktemp: не удалось создать файл через шаблон
  • Разрешение отклонено без подключения ssh
  • Как труба участвует в ssh?
  • Как узнать все файлы на других машинах, используя сценарий оболочки bash?
  • Сценарий манипулирования открытыми ключами SSH в файле authorized_keys
  • Linux и Unix - лучшая ОС в мире.