распечатать все совпадения или заменить все строки в BIG-файле, который не является строковым (без разделителей строк)

У 5GB-файлов у меня есть потоки строк данных:

{datarow1...},{datarow2...},...,{datarowN...} 

так что на самом деле можно сказать, что существуют строки {} и даже разделители строк, но в виде трехсимвольной последовательности: },{

Я хочу сделать две вещи:

  1. напечатайте « lines », в которых есть строка "error" :

     grep -o -P {[^{}]+?error.+?} ES01.log > ES01.err.log 
  2. сделать файл более «дружественным», явно создавая файлы с новыми разделителями строк

     <ES01.log sed -e 's/},{/}\n{/g' > ESnl01.log 

Хотя это работает для относительно небольших файлов (до ~ 100 Мбайт), мои файлы, к сожалению, намного больше, поэтому проблемы с памятью здесь:

  grep: memory exhausted sed: couldn't re-allocate memory 

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

Любая идея, как подойти к этому, используя какой-то другой смарт-лайнер?

4 Solutions collect form web for “распечатать все совпадения или заменить все строки в BIG-файле, который не является строковым (без разделителей строк)”

С gawk :

 gawk -v 'RS=},{' '{sub(",", "\n", RT); printf "%s", $0 RT}' < file 

perl-эквивалент:

 perl -pe 'BEGIN{$/="},{"}; s/\,{$/\n{/' < file 

В противном случае POSIXly:

 tr , '\n' < file | awk '{ if (/^{/ && e) print "" printf "%s", $0 if (/}$/) e=1 else {e=0; printf ","}} END {print ""}' 

paste -sd, - с grep error чтобы увидеть записи с ошибками и paste -sd, - восстановить исходный формат.

Вы также можете сделать это в Perl:

 perl -ne 'BEGIN{$/="},{"} chomp; s/\n$//; s/^{//; s/}$//; print "{$_}\n"; ' k 

Это тот же принцип, что и gawk , предложенный StephaneChazelas, в Perl $/ является разделителем записей, поэтому мы устанавливаем это на },{ чтобы правильно читать записи, а затем печатать их с символами новой строки.

Вы можете легко расширить это, чтобы выполнить обе операции, которые вы просите:

 perl -i -ne 'BEGIN{$/="},{"} chomp; s/\n$//; s/^{//; s/}$//; print "{$_}\n"; print STDERR "{$_}\n" if /error/' file 2> ES01.err.log 

Если вы хотите попробовать программу, которая, вероятно, еще не установлена ​​в вашей системе, попробуйте gsar , объясненный в этом ответе на ту же проблему.

gsar – это поисковая и (необязательно) утилита замены, которая работает с двоичными файлами. Однако он не может искать регулярные выражения.

Эта команда:

 gsar '-s},{' '-r}:x0A{' ES01.log > ESnl01.log 

заменяет запятую между }{ символом новой строки, считая из ES01.log и перенаправляя вывод в ESnl01.log.

Строки поиска ( -s ) и замены ( -r ) не имеют одинаковой длины.

Вы можете сделать это просто через Perl, используя регулярное выражение.

 perl -pe 's/(?<=}),(?=\{)/\n/g' file 
  • Установить теорию с помощью инструментов unix: «расслабленное» пересечение двух списков, где элемент в наборе 1 является по меньшей мере подстрокой элементов в наборе 2
  • Найдите любые линии, превышающие определенную длину
  • Замена нового символа линии на канал и новый символ строки
  • Сортировка записей по полю назад (не сверху вниз)
  • Добавление строки в таблицу
  • удалять строки, которые суммируются до нуля
  • Как заменить другой текст на одну строку из csv?
  • голову, хвост, а затем линию?
  • Добавить файл данных 2 в файл 1 без заголовка
  • изменение порядка элементов в списке
  • файл формата для удаления "символов
  • Interesting Posts

    Postgres: аутентифицировать пользователя postgres в неинтерактивном скрипте

    CentOS определяет те же дату и часовой пояс для системы и MySQL

    Отправить «ввести ключ» в скрипт python из bash

    На ошибке страницы, как Unix определяет, находится ли адрес сбоя в области подкачки?

    Есть ли простой тест на что-либо, напечатанное на stderr в shell / Bash?

    /etc/init.d/nis отсутствует на Ubuntu

    безопасно запускать все скрипты в каталоге

    find -exec mv останавливается после первого запуска

    KDE5 kate не будет открывать удаленное местоположение ssh (рыба) открытого файла

    Как управлять установленными из исходных программ?

    Имеется ли в дереве устройств информация, такая как Режим работы (Режим загрузки)?

    Дубликаты в истории bash

    -lpopt не найден во время перекрестного компиляции для aarch64

    Автоматизировать ввод в оболочку программы

    Можно ли настроить ядро ​​Linux для запуска сценария пользовательского пространства, когда происходит сбой ядра?

    Linux и Unix - лучшая ОС в мире.