2017-02-23 9 views
0

Я хочу искать строки с отметками времени в файле журнала (не все строки имеют временные метки), и я также хотел бы сохранить эти временные метки, чтобы я мог видеть временные интервалы, активный день номер и т.д.grep сопоставил строки в один файл и сопоставил строки в другом файле

201 3083560 2013-10-21T13:57:55.334+0200 time|bootup 
202 3083560 2013-10-21T13:57:55.334+0200 startup 
204 3083579 2013-10-21T13:57:55.353+0200 system|device 
205 3083579 2013-10-21T13:57:55.353+0200 system|manufacturer 
206 3083579 2013-10-21T13:57:55.353+0200 system|model 

Я могу выполнить команды:

grep -P '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file1.txt 
grep -Po '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' usr.log > file2.txt 

И мой вопрос, могу ли я работать Grep только один раз, чтобы получить то, что мне нужно с некоторыми трубами? Шаблон остается таким же, поэтому я думаю, что grep однажды может сэкономить некоторое время, так как у меня есть 30k отдельных файлов журнала пользователя.

* Полезно сохранить вкладку в конце шаблона, потому что в некоторых строках есть значения времени в последнем столбце, поэтому мне нужно исключить \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\n.

* Моя среда - CentOS 7, grep (GNU) 2.20.

Большое спасибо!

+0

Вам не нужно запускать его дважды, вы можете использовать 'Grep -oP' в' usr.log' непосредственно. – Inian

+0

Также ваше регулярное выражение '\ d {4} - \ d {2} - \ d {2} T \ d {2}: \ d {2} \ d {2} \. \ D {3} [+ -] \ d {4} \ t' или '\ d {4} - \ d {2} - \ d {2} T \ d {2}: \ d {2} \ d {2}. \ d {3} [+ -] \ d {4} \ n' не соответствует строкам в вашем примере ввода файла – Inian

+0

Спасибо! Я забыл поставить еще: в шаблоне. Теперь я исправил это. Но как это можно сделать за один проход? Я хочу также сохранить файл1.txt. – leoce

ответ

0

Я не думаю, что это может быть сделано одним grep, но вы можете уйти с чтением файла один раз и повторно использовать выход grep «s, если вы пришлете вывод одного Grep другому:

regex='\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}\t' 
grep -P "$regex" usr.log | tee file1.txt | grep -Po "$regex" > file2.txt 

tee file сохраняет входной файл и печатает также в стандартном режиме, что делает полезным сохранение вывода в середине трубы.

Если вы можете использовать awk, то вы можете воспользоваться причем третьим полем, и сделать это в один проходе:

awk '/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}.[0-9]{4}\t/ \ 
    {print $3 > "file2.txt"; print}' usr.log > file1.txt 
0

Если запустить регулярное выражение в Perl'х вы можете разделить ваш выход между стандартным выводом и стандартный вывод, используя переменную $& для печати только найденную строку:

perl -ne 'if(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{4}/){print; print STDERR "$&\n"}' usr.log > file1.txt 2> file2.txt 
Смежные вопросы