2013-04-03 4 views
-1

У меня есть каталог (/home/myuser/logs), который содержит следующие файлы журналов за последние 5 дней:Bash/Python/Perl магии, чтобы получить агрегированные DateTimes через несколько файлов журнала

applogs_20130402.txt 
applogs_20130401.txt 
applogs_20130331.txt 
applogs_20130330.txt 

Каждая строка каждого «applog» имеет ту же структуру, просто разные данные:

<timestamp> | <fruit> | <color> | <cost> 

Так, например, applogs_20130402.txt может выглядеть так:

23:41:25 | apple | red | 53 
23:41:26 | kiwi | brown | 12 
23:41:29 | banana | yellow | 1023 
... (etc., every line is pipe delimited like this) 

Я хочу создать один «главный журнал», который объединяет все записи журнала (структурированные, линии с разделителями строк) из всех 5 файлов журнала в один файл, где хронологически упорядочены все временные метки. Кроме того, мне нужна дата, отраженная на отметках времени.

Так, например, если applogs_20130402.txt и applogs_20130401.txt были единственными 2 applogs в каталоге, и они оба смотрели, как это соответственно:

applogs_20130402.txt: 
===================== 
23:41:25 | apple | red | 53 
23:41:26 | kiwi | brown | 12 
23:41:29 | banana | yellow | 1023 

applogs_20130401.txt: 
===================== 
23:40:33 | blueberry | blue | 4 
23:41:28 | apple | green | 81 
23:45:49 | plumb | purple | 284 

Затем я хочу masterlog.txt файл, который выглядит следующим образом:

2013-04-01 23:40:33 | blueberry | blue | 4 
2013-04-01 23:41:28 | apple | green | 81 
2013-04-01 23:45:49 | plumb | purple | 284 
2013-04-02 23:41:25 | apple | red | 53 
2013-04-02 23:41:26 | kiwi | brown | 12 
2013-04-02 23:41:29 | banana | yellow | 1023 

Я нахожусь на Ubuntu и имею доступ к Bash, python и perl и не имею предпочтения, какое решение используется. Обычно я бы попробовал «лучшую попытку» и опубликовал его, но я никогда не занимался объединением данных, подобных этому в Linux. Очевидно, что журналы являются тысячами строк по размеру, в отличие от моего примера выше. Так что делать все вручную не вариант ;-) Спасибо заранее!

+0

Почему downvote? – IAmYourFaja

+0

Кажется, достаточно легко с некоторыми командами командной строки, но что вы пробовали? Я не голосовал, но я бы сказал, это потому, что вы не прилагаете никаких усилий. – squiguy

+2

Не имеет значения, находитесь ли вы в Windows или Linux. Я не был нисходящим, но я думаю, что немного больше усилий, помимо описания проблемы, не повредит. – simbabque

ответ

1

Вы можете использовать Perl из командной строки вместе с sort как это:

perl -n -e 'printf "%d-%02d-%02d %s", $ARGV =~ m/_(\d{4})(\d\d)(\d\d)/, $_;' *.txt | sort -n 

Calling perl with -n обертывания while (<>) { } вокруг вашей программы, которая в данном случае является материал в -e ''. В ней мы printf текущей строки ($_), и перед этим мы помещаем дату из имени файла, которое is stored in $ARGV. Мы используем regex, чтобы захватить год, месяц и день, которые удобно вернуть m// из-за контекста списка из printf.

К этой программе мы передаем все файлы txt в папке. Результат передается по каналу в сортировку инструмента командной строки, которая сортирует строки численно, используя флаг -n.

+0

Спасибо @simbabque (+1) - когда я набираю это и нажимаю enter (внутри терминала), я вижу новую строку с символом «>», и ничего не происходит. Есть идеи? Еще раз спасибо! – IAmYourFaja

+1

Поскольку созданы полные даты и время, я думаю, вы можете использовать сортировку без флага '-n', поскольку они сортируются по алфавиту. И я думаю, что вам не хватает одной цитаты после $ _; и до * .txt. –

+0

Еще раз спасибо, но все равно.Это почти похоже на то, что он открывает сеанс или что-то в этом роде, или ждет какой-то вход от меня ... – IAmYourFaja

0

Просто для полноты картины, здесь (г) AWK один лайнер, чтобы выполнить то же самое:

gawk '{ printf "%s %s\n", gensub(/.+_([0-9]{4})([0-9]{2})([0-9]{2}).+/, "\\1-\\2-\\3", "", FILENAME), $0 }' applogs_* | sort 

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

  • Нет связанных вопросов^_^