2015-06-18 1 views
2

Я пытаюсь сделать вывод работы нескольких файлов журналов немного более удобным для Unix.Повторяя текст перед каждой строкой после grep и вырезаем Unix

Файлы журнала переходят из Web.log, являющегося самым старым, до самого Web.log.30. Я собираю job123 из этих файлов, а затем соединяюсь с новым grep, где он принимает только строки с сообщением Exit, что означает, что задание завершено. Затем я разрезал его в запятой, чтобы я печатал только временные метки, а не всю строку. Вот мой сценарий:

for file in `ls -tr Web.log*`; do grep job123 $file | grep Exit | cut -d "," -f1; done 

который выводит мне временные метки, которые я хочу, в хронологическом порядке:

2015-06-17 21:07:00 
2015-06-17 22:07:00 
2015-06-17 23:07:00 
2015-06-18 00:07:00 
2015-06-18 01:07:00 
2015-06-18 02:07:00 
2015-06-18 03:07:00 

Все, что я хочу сделать, это добавить эхо в начале каждой строки, говоря «Script job123 побежал: "так это будет выглядеть следующим образом:

Script job123 ran at: 2015-06-17 21:07:00 
Script job123 ran at: 2015-06-17 22:07:00 
Script job123 ran at: 2015-06-17 23:07:00 
Script job123 ran at: 2015-06-18 00:07:00 
Script job123 ran at: 2015-06-18 01:07:00 
Script job123 ran at: 2015-06-18 02:07:00 
Script job123 ran at: 2015-06-18 03:07:00 

Как пользователь едва знает Unix, мне просто нужно, чтобы сделать это в качестве удобной, как можно прочитать. Я борюсь с эхом.

Также каждый из файлов журналов имеет длину около 25 МБ, поэтому серия труб может быть потребляемой в памяти, поэтому, если у кого-то есть предложения по ускорению процесса, это очень ценно.

Обратите внимание, что это на производственном сервере, поэтому установка других сценариев, таких как multigrep, не может быть и речи. Я пытаюсь сделать это как однострочный скрипт, чтобы сделать использование более простым для пользователя.

В любом случае, я могу повторить этот текст в скрипте, который я сейчас использую? Я уже пробовал повторять его в несколько этапов, но не повезло.

спасибо.

+1

вы можете трубы его в AWK , 'для файла в' ls -tr Web.log * '; do grep job123 $ file | Выход grep | cut -d "," -f1 | awk '{print "Работа скрипта123 запускалась по адресу:" $ 0}'; done – c4pone

+0

Спасибо @ c4pone, ваше решение было самым быстрым! – iLuPa

+0

no беспокойство мужчина. Рад, что смог помочь – c4pone

ответ

1

Повторное использование кода, это может быть достигнуто путем замены cut команды (cut -d "," -f1) с awk -F, '{print "Script job123 ran at: " $1}'

Else то же самое может быть достигнуто с только awk:

for file in `ls -tr Web.log*`; do awk -F, '/job123/&&/Exit/{print "Script job123 ran at: " $1}' $file; done 
1

магазина выходная вашей команды в переменном и печати с дополнительным текстом:

for file in `ls -tr Web.log*`; do 
    out=$(grep job123 $file | grep Exit | cut -d "," -f1;) 
    echo "Script job123 ran at: ${out}" 
done 

Вы также можете объединить два Grep в единый:

out=$(grep -E 'job123.*Exit|Exit.*job123' $file) 

Если вы можете использовать awk, то это может упрощено к одной команде:

out=$(awk -F, '/job123/&&/Exit/{print $1}' $file) 

Поскольку вам придется p осел каждой линии, awk решение (без труб) будет лучше. Но я не могу сказать, как сильно вы ускоряетесь.

Смежные вопросы