Как выполнить мультилинию grep через несколько файлов?

В зависимости от Вашего распределения Вы могли добавить пользовательский сценарий уведомления. На, например, Ubuntu Вы могли использовать inotify-send. Добавьте некоторую комбинацию сочетания клавиш для записи состояния в файл.

Например, Alt+Shift+M

Затем настройте Skype для использования этого сценария вместо внутреннего:

  1. Выберите уведомления
  2. Включите усовершенствованное представление
  3. Снимите флажок со всплывающим уведомлением о Дисплее
  4. Включите Выполняют следующий сценарий
  5. Введите путь к сценарию

enter image description here

5
19.06.2014, 16:54
1 ответ

Как я говорил в своем комментарии, команда, которую вы разместили, прекрасно работает на моем LMDE (pcregrep версия 8.31 2012-07-06). Однако, так как ваш регекс указывает только часть строки, которую вы ищете, вы также можете сделать это с помощью обычного grep:

grep -A 6 'Found an' log_*.txt | grep -C 3 10019874

-A 6 выведет строку, соответствующую переданной строке, и следующие 6 строк, а -C 3 выведет 3 окружающих строк. Конечный результат в точности совпадает с подходом -C 3, который вы использовали при печати -C 3.


Если ваш образец может иметь разное количество линий, это может объяснить сегментацию. Предположительно, в некоторых ваших файлах совпадающий раздел слишком длинный и вызывает ошибку в памяти. Одним из способов обойти это может быть небольшой скриптинг:

perl -ne '$c=1 if /Found an/; ## set $c to 1 if this line matches 'Found on'
          if($c){               ## If $c is defined and non-0
            push @F,$_;         ## Add the current line to the @F array
            $c++ if /10019874/; ## Increment $c if this line matches '10019874'
            if(/Processed/){    ## If this line matches 'Processed'
                print "@F" if $c>1; ## Print the contents of @F if $c is >1
                @F=""; $c=0;         ## Empty @F, set $c to 0.
            }
           }' log_*.txt 

То же самое, что и один лайнер:

perl -ne '$c=1 if /Found an/; if($c){push @F,$_; $c++ if /10019874/; if(/Processed/){print "@F" if $c>1; @F=""; $c=0;}}' log_*txt 
4
27.01.2020, 20:40

Теги

Похожие вопросы