Intereting Posts
Использование подстановок / подстановочных знаков при открытии файлов с терминала Linux заблокирован на df Файловый дескриптор просочился на вызов lvchange. Используемый логический том Добавить имя файла в качестве первой строки файла в сценарии оболочки Шифрование импорта импорта с помощью gpg в одно и то же время В чем разница между этими двумя наборами команд для настройки разрешений ACL? Какое имя приложения отображает пользовательский текст в полноэкранном размере? Как установить Linux (или аналогичную ОС) на смартфон? ZIP-пароли для Linux? apt-get возвращает странную ошибку Как использовать не жадное регулярное выражение в grep? Debian sudo не работает Как получить хронологический список обновлений пакетов в debian? Как сопоставить группу 1 в регулярном выражении, за которой следует 0, а не соответствующая группа 10 Почасовой cronjob не работает

Разбор нескольких разделов данных в отдельные файлы

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

Пока у меня есть …

sed -n '/--- LOG REPORT ---/,/--- LOG REPORT ---/p' logname.log > test.out 

Однако, как вы можете себе представить, это выводит только первый экземпляр шаблона. Я просмотрел страницу man для sed, и я не уверен, что он может выводить несколько файлов. Возможно, я мог бы продолжать извлечение из файла, пока он не станет пустым, но это похоже на слишком много работы. Как я могу это достичь? Может быть, я должен использовать awk?

Пример входного файла filename.log

 --- LOG REPORT --- Mary Had A Little Lamb --- LOG REPORT --- Her Fleece Was White As Snow 

Желаемый результат:

В filename_1.log

 --- LOG REPORT --- Mary Had A Little Lamb 

В filename_2.log

 --- LOG REPORT --- Her Fleece Was White As Snow 

Как насчет чего-то вроде

 awk '/--- LOG REPORT ---/ {n++;next} {print > "test"n".out"}' logname.log 

Как насчет этой команды?

 csplit logname.log /---\ LOG\ REPORT\ ---/ {*} 

тестирование

 cat logname.log --- LOG REPORT --- Mary Had A Little Lamb --- LOG REPORT --- Her Fleece Was White As Snow 

После выполнения вышеприведенной команды вывод, который я получаю,

 cat xx01 --- LOG REPORT --- Mary Had A Little Lamb cat xx02 --- LOG REPORT --- Her Fleece Was White As Snow 

Неправильный инструмент, используйте perl или awk, например

 cat > splitFileByLogReport.pl <<EOF #!/usr/bin/perl undef $/; $_ = <>; $n = 0; for $match (split(/(?=--- LOG REPORT ---)/)) { open(O, ">$ARGV[$argnum]" . ++$n); print O $match; close(O); } 

EOF

Затем запустить:

 perl splitFileByLogReport.pl yourFile.txt