Сценарий оболочки или команда для Разделения выборок текстовых и Двоичных файлов от больших Файлов журнала

Понять то, что продолжается, выполненный

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

Начиная с $ символы находятся в двойных кавычках (когда они расширены после того, как псевдоним расширен), они интерпретируются оболочкой. Для разбираний в заключении в кавычки легче поместить целое определение псевдонима в одинарные кавычки. То, что в одинарных кавычках, - то, что будет расширено, когда псевдоним будет использоваться. Теперь, когда аргумент awk окружается в двойных кавычках, ясно, что Вам нужны обратные косые черты прежде \"$.

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

Полезная идиома к одинарной кавычке единственно заключенная в кавычки строка является этим '\'' в значительной степени способ поместить литеральную одинарную кавычку в единственно заключенную в кавычки строку. Технически существует сопоставление единственно заключенной в кавычки строки, заключенного в кавычки из обратной косой черты ', и другая единственно заключенная в кавычки строка. Сочетавшая пустая строка '' в конце может быть удален.

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

После этого долгого объяснения, рекомендации: когда это будет слишком сложно для псевдонима, используйте функцию.

3
13.07.2011, 15:16
4 ответа

Кажется, что Ваши файлы журнала являются на самом деле форматом XML. Если это так, затем то, что ДЕЙСТВИТЕЛЬНО необходимо делать, использует синтаксический анализатор XML. Прочитайте этот известный ответ StackOverflow, если Вы хотите еще некоторую информацию.

На основе Вашего описания основанный на SAX синтаксический анализатор является, вероятно, Вашим лучшим выбором: они - потоковые синтаксические анализаторы и не требуют, чтобы Вы загрузили целый файл в памяти. Так как Вы только выполняете очень простое преобразование на XML, XSLT является, вероятно, действительно хорошим кандидатом на это (и это должен быть FAST, если Вы используете xsltproc от libxslt). Вот ТАК ответ, который демонстрирует потенциально соответствующую технику.

2
27.01.2020, 21:24

Если существует несколько строк между /start/ и /end/ шаблоны затем можно использовать диапазоны и d.

В целом

/start/,/end/d

удалит все строки между /start/ и /end/ включительно.

Создайте файл и добавьте, что следующие строки затем сохраняют его как somefile

/<\"my:PDF\">/,/<\"\/my:PDF\">/d
/<\"applicationForm\">/,/<\"\/applicationForm\">/d
/<\"image\">/,/<\"\/image\">/d
/<\"extractedSignature\">/,/<\"\/extractedSignature\">/d

затем используйте его как так

sed -f somefile logfile >prunedfile
1
27.01.2020, 21:24

Необходимо смочь сделать что-то вроде этого с sed:

cat LOG | sed -e "s/<\"my:PDF\">.*<\/\"my:PDF\">/<\"my:PDF\"><\/\"my:PDF\">/g;" > LOGx

По существу это говорит, "Ищут шаблон <"my:PDF"> сопровождаемый любым количеством любого символа, сопровождаемого шаблоном </"my:PDF"> и замените его шаблоном <"my:PDF"></"my:PDF">, сделайте это глобально".

Повторитесь по мере необходимости для других строк, которые необходимо занять место.

0
27.01.2020, 21:24

Редактирование активных журналов хитро и опасно, таким образом, необходимо будет ожидать, пока они не повернуты из сервиса. Если это не возможно, Вы, возможно, должны проверить, можно ли r регистрирующаяся программа передать вывод фильтру вместо того, чтобы писать в файл. Фильтр может затем разделить нежелательные записи, прежде чем информация будет записана в диск. Это несколько более более опасно, как будто фильтр перестает работать, записи в журнале будут потеряны.

Печально регулярные выражения sed являются "жадными". Если единственная строка журнала имеет два или больше поля, Вы хотите разделить sed, разделит все промежуточное:

<"my:PDF">.*?<"/my:PDF"><"keeper">.*?<"/keeper"><"my:PDF">.*?<"/my:PDF">

С-p опцией (см. человека perlrun) жемчуг может быть сделан вести себя во многом как sed, но со способностью попросить нежадные регулярные выражения (? в *?):

perl -p -e '\
    s|<"my:PDF">.*?<"/my:PDF">||g; \
    s|<"applicationForm">.*?<"/applicationForm">||g; \
    s|<"image">.*?<"/image">||g; \
    s|<"extractedSignature">.*?<"/extractedSignature">||g; \
           '  huge.log >huge.log~ && \
mv huge.log~ huge.log
0
27.01.2020, 21:24
  • 1
    Вам всем, я использовал другой подход sed-n.. –  Doknik 04.08.2011, 12:35

Теги

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