2016-12-02 3 views
3

У меня есть следующий пример файла:Отдельный текстовый файл с СЭД

evtlog.161202.002609.debugevtlog.161201.162408.debugevtlog.161202.011046.debugevtlog.161202.002809.debugevtlog.161201.160035.debugevtlog.161201.155140.debugevtlog.161201.232156.debugevtlog.161201.145017.debugevtlog.161201.154816.debug 

Я хочу разделить строку и добавить новую строку после согласования «отладки», как это:

evtlog.161202.002609.debug 
evtlog.161201.162408.debug 

До сих пор Я попробовал почти все с sed, но, похоже, он не делает того, что я хочу.

sed 's/debug/{G}' latest_evtlogs.out 
sed '/debug/i "SAD"' latest_evtlogs.out 

и т.д ... sed 's/debug/\n/g' latest_evtlogs.out не работает, когда я добавляю его в качестве трубы в сценарии, но это происходит, когда я запускаю его вручную.

Вот как я генерировать файл:

printf $(ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/\n/g') >> latest_evtlogs.out 

Сначала я хотел просто добавить строку с AWK, но он не работает. Любые идеи, почему я не могу выделить строку с помощью новой строки?

Я использую:

Distributor ID: Debian 
Description: Debian GNU/Linux 5.0.10 (lenny) 
Release:  5.0.10 
Codename:  lenny 
+1

Уверены ли вы, что вы не много обрабатываете, вам не нужно? Вы используете 'ls -l' для получения полного списка каталога, а затем с помощью Awk извлекаете только имя файла и печатаете его без новой строки, а затем пытаетесь добавить новые строки. Почему нет более простого «скрипта» 'ls $ EVTLOG_PATH/evtlog | tail -n 10 >> last_evtlogs.out' делать то, что вы хотите? –

+0

@ K.A Buhr, я попробовал, и он снова возвращает одну строку. –

+0

Команда 'awk', которая была использована для генерации выходного файла, неверна. Строка формата должна быть первым параметром: 'awk '{printf"% s \ n \ n ", $ 8}''. Просить. А. Бур предположил, что лучше использовать 'ls' вместо' ls -l', потому что тогда не будет необходимости использовать 'awk'. – pjh

ответ

0

Спасибо всем за answers.I наконец сделал это так:

echo $(ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/&\n/g') > temp.out 

sed 's/ /\n/g' /share/sqa/dumps/5314577631/checks/temp.out > latest_evtlogs.out 

Это совсем не изящно, но, в конце концов, он работает.

2

Просто добавьте новую строку после debug:

sed 's/debug/&\n/g' file 

Примечание & печатает обратно совпадающий текст, так что это способ печати «отладки» назад ,

Это возвращает:

evtlog.161202.002609.debug 
evtlog.161201.162408.debug 
evtlog.161202.011046.debug 
evtlog.161202.002809.debug 
evtlog.161201.160035.debug 
evtlog.161201.155140.debug 
evtlog.161201.232156.debug 
evtlog.161201.145017.debug 
evtlog.161201.154816.debug 
+0

Нет, я все еще получаю один и тот же: evtlog.161202.052817.debugevtlog.161201.212509.debugevtlog.161202.061126.debugevtlog.161202.062853.debugevtlog.161201.210226.d ebugevtlog.161201.205214.debugevtlog.161202.043057.debugevtlog.161201.205053.debugevtlog.161201.204846.debugevtlog.161201.211047.debugevtlog .161201.205132.debugevtlog.161201.205527.debugevtlog.161201.205217.debugevtlog.161202.043335.debugevtlog.161202.045555.debug –

+0

@VeselinIvanov жаль в комментариях, мы не можем понять такие результаты. Лучше обновите свой вопрос индикатором, какова ваша цель, так как похоже, что это часть длинного конвейера. – fedorqui

+0

жаль, что это кажется нечитаемым. Что я имею в виду, это все еще одна строка, и никаких изменений в выходе нет. –

0

Может быть Perl является "счастливее" чем СЭД на вашей системе:

perl -pe 's/debug/&\n/g' < YourLogFile 
0

G и др приложат, что в трюме буфере ко пространство шаблона (обычно только текущая строка, считанная из входного файла). Это невозможно использовать.

i nsert напечатает указанный текст до стандартного вывода. Поэтому это нельзя использовать.

Что вы вы хотите, чтобы заменить все debug с debug^J, где ^J является символом новой строки, в зависимости от SED версии, вы можете сделать:

sed 's/debug/&\n/g' input_file 

Но \n это - AFAIK - строго не указано в POSIX sed. Можно, однако, использовать гр строку:

sed 's/debug/&'$'\n''/g' input_file 

Или натянуть многоканальную линию:

sed 's/debug/&\ 
/g' input_file 
1

Проблема заключается в том, что вы используете выход sed в расширении команды. В этом контексте ваша оболочка заменит все новые строки пробелами.Затем пробелы используются для разделения слов, так что printf рассматривает каждую строку как отдельный аргумент, интерпретируя первую строку как аргумент формата и игнорируя остальные, поскольку в формате есть printf-заполнители.

Он должен работать, если вы уронили внешний printf $() из вашей команды и просто перенаправить вывод из вашего трубопровода в файл:

ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/\n/g' >> latest_evtlogs.out 
Смежные вопросы