Как сделать 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 с сервером закрывается после аутентификации сразу
  • Вызов Bash продолжает исчезать
  • CentOS 7 - ssh login отказано, когда я использую открытый ключ ssh, но работает только с именем пользователя
  • SSH: «Соединение закрыто удаленным хостом» случайным образом во время работы на интерактивной сессии
  • Есть ли причина для того, чтобы ssh и sftp были настолько неинтегрированы?
  • SSH-туннелирование: connect_to localhost port 22: failed
  • Как я нажимаю Mercurial репозиторий на BitBucket поверх 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

    Как войти в однопользовательский режим с отключенным пользователем root?

    Получить ветвь git из нескольких папок / репозиториев

    Захват файла журнала из нескольких сценариев

    Получение большой endian linux для загрузки на ARM с u-boot

    Заголовок экрана на первой строке терминала

    Как эффективно добавить файл в список args для vim изнутри vim?

    'while read line do' cause: "синтаксическая ошибка около неожиданного токена` done '"в скрипте Linux bash

    Как запустить команду systemctl для корневого монтирования

    Почему нет? регулярный символ создает совпадение в sed?

    ffmpeg с поддержкой mp3: Как установить (использовать) в пользовательском режиме?

    AIX – использовать встроенные функции ksh для освобождения памяти, когда fork невозможно

    В чем разница между именем пользователя, отображаемым именем и именем входа?

    загрузить отсутствующую библиотеку из ~ / без root или symlinks на совместном хостинге?

    дождитесь завершения подключения autossh

    Проблема с сервером Airprint для iOS 6

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