Как сделать 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 / SCP
  • Храните приложение x11 GUI, перенаправленное через ssh после потери соединения
  • Не удается записать в домашний каталог / файлы при входе через SSH с открытым ключом
  • Не удается ssh на другой компьютер, но может пинговать его?
  • Как загружаются SSH-ключи, на которые ссылается имя?
  • Почему я все еще получаю приглашение пароля с помощью ssh с аутентификацией ключа?
  • Как скопировать каталоги через ssh
  • 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)' 
    Interesting Posts

    Создайте именованный канал / fifo, который выполняет команду при чтении

    Почему мой рабочий стол блокируется, когда я копирую много файлов на USB-накопитель?

    Чтение пространства в качестве входного файла в сценарии оболочки

    Уменьшите размер шрифта в Cinnamon из командной строки

    Что такое «стоп-задание», как в «Завершение работы работает …»?

    Не удается записать на внутренний раздел HDD NTFS в Parrot OS

    Переименование файлов в локальной папке с добавлением префикса или суффикса

    Вдруг потеряли все кроны

    Как порядок, в котором ключи хранятся и повторно определены в awk?

    ZFS Ubuntu 16.04 Замените диск самим

    Какие препараты следует выполнять перед переустановкой окон?

    Я хочу изменить корневые файлы, а также создавать файлы без root в одном сеансе текстового редактора.

    Как разбить новое окно и запустить команду в этом новом окне с помощью tmux?

    Существуют ли проверки орфографии, которые знают о Markdown?

    Создание репозитория пакетов Debian для распространения нескольких версий настраиваемого пакета deb

    Linux и Unix - лучшая ОС в мире.