LINUX.ORG.RU

awk: удалить переводы строки по условию

 


0

1

Всех приветствую! Исходные данные:

1. 1Гб логов, расположенных в разных файлах

2. Блоки лога в файле имеют вид:

12:46-000012.TYPE,Message=«некое

событие записанное

в лог»

12:55-000128.TYPE,Message=«Что-то

случилось»

Нужно что бы было: 12:46-000012.TYPE,Message=«некое событие записанное в лог»

12:55-000128.TYPE,Message=«Что-то случилось»

Что пробовал: find - получаю строки и передаю их в awk, где по регулярке вставлял символ '#' в начало каждой строки, затем tr удалял все \n, затем '#' менял '\n'. Это все отрабатывает на маленьких объемах, но на больших нет и это понятно почему.

Вижу несколько вариантов решения:

1. когда считываем первый блок построчно, считывать до тех пор пока не встретится '12:55-000128' исключая эту подстроку

2. считать сразу блоком, где разделителем будет являться подстроки типа:'12:46-000012'.

3. gawk -F'-' '{if($1 ~ /#[0-9]+:[0-9]+-/) print «\n»; убратьВсеПереводыСтроки}'

awk, sed, недавно изучаю, но тут какой-то тупик. Подскажите пожалуйста решение по моему вопросу.

Ответ на: комментарий от vel

Спасибо! Все работает, на первый взгляд.

Не могли бы Вы объяснить вот это: {if(m) print m;m=$0}else{m=m$0}}END{if(m) print m}

И просьба, кинуть пару букварей awk, что бы вникнуть в тему. Спасибо еще раз.

Danilov ()
Ответ на: комментарий от Danilov

букварь у нас один «man gawk»

$0 - это строка целиком

«m=m$0» это сложение строк

END{} - блок который выполняется после чтения входного потока.

Переформатируй в читаемый вид и все станет понятно.

vel ★★★★★ ()
Ответ на: комментарий от Danilov

Не могли бы Вы объяснить вот это: {if(m) print m;m=$0}else{m=m$0}}END{if(m) print m}

Это у vel из за привычки писать в основном не на awk :) Понятнее будет так (заодно и пробел будет вместо \n):

/^[0-9][0-9]:[0-9][0-9]-/ {if(m) print m; m=$0; next }
{ m=m" "$0 }
END { if(m) print m }

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Ясно, спасибо! Правильно ли я понимаю что if(m) означает проверку на то что переменная m - инициализирована? И что означает next в {}?

Danilov ()
Ответ на: комментарий от Danilov

Правильно ли я понимаю что if(m) означает проверку на то что переменная m - инициализирована?

Не совсем. Не пустая.

И что означает next в {}?

Ну это точно есть в документации на awk. Закончить обработку строки и взять следующую. Можете сравнить результат, если это убрать.

vodz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.