Из памяти при использовании sed с многострочными выражениями на гигантском файле

ltrace - Трассировщик вызова библиотеки.

Это только работает над Linux и в небольшом подмножестве архитектуры. Вызовы к dlopen () библиотеки редактора не будут прослежены. Дальнейшие указатели из страницы справочника и /etc/ltrace.conf

4
01.02.2013, 16:52
3 ответа

Ваши первые три команды являются преступником:

:a
N
$!ba

Это читает весь файл в память сразу. Следующий сценарий должен только сохранить один сегмент в памяти за один раз:

% cat test.sed
#!/usr/bin/sed -nf

# Append this line to the hold space. 
# To avoid an extra newline at the start, replace instead of append.
1h
1!H

# If we find a paren at the end...
/)$/{
    # Bring the hold space into the pattern space
    g
    # Remove the newlines
    s/\n//g 
    # Print what we have
    p
    # Delete the hold space
    s/.*//
    h
}
% cat test.in
a
b
c()
d()
e
fghi
j()
% ./test.sed test.in
abc()
d()
efghij()

Это awk решение распечатает каждую строку, как это прибывает, таким образом, это будет только иметь одну строку в памяти за один раз:

% awk '/)$/{print;nl=1;next}{printf "%s",$0;nl=0}END{if(!nl)print ""}' test.in
abc()
d()
efghij()
3
27.01.2020, 20:56
  • 1
    Это просто печатает abc () и остановки? –  kurast 01.02.2013, 19:31
  • 2
    , который я только что проверил и это не останавливается. Спасибо –  kurast 01.02.2013, 19:39

Для полноты, решения для Perl: perl -p -e '/)$/ || chomp'

Для симметрии: -p переносит Ваш сценарий в чтение цикла и печать линию за линией; -e соответствия выражения/сценария ) в конце строки, если это не соответствует (соответствие является ложью) это переходит к chomp, который удаляет новую строку в конце.

1
27.01.2020, 20:56

используйте это:

sed -i -z -u 's/\n/ /g' reallyBigFile.log

-г, --ноль -данные
отдельные строки символами NUL

-u, --небуферизованный
загружать минимальные объемы данных из входных файлов и чаще очищать выходные буферы

0
27.01.2020, 20:56

Теги

Похожие вопросы