Как сделать 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.

  • Как правильно запустить команду «сверху» через SSH?
  • как проверить, работает ли ssh без подключения к серверу
  • Как запустить команду SSH для установки StrictHostKeyChecking = no?
  • SSH-доступ, запрашивающий пароль в локальной сети, но общедоступный
  • Вход SSH с четким текстовым паролем в качестве параметра?
  • Ошибка rsync: необъяснимая ошибка (код 255) в io.c (226)
  • Работайте с двухфакторным SSH-сервером с помощью мастер-соединения и переадресации портов?
  • SSH с Cron: ключ RSA не принят
  • 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)' 
    Linux и Unix - лучшая ОС в мире.