Отдельный текст журнала в соответствии с пунктом?

****************
* 192.168.1.1
****************
ssh -q 192.168.1.1 ntpstat
synchronised to NTP server (192.168.204.1) at stratum 5
time correct to within 281 ms
polling server every 1024 s

****************
* 192.168.1.3
****************
ssh -q 192.168.1.3 ntpstat
synchronised to NTP server (192.168.1.2) at stratum 12
time correct to within 57 ms
polling server every 1024 s

У меня есть этот текст журнала, и я хочу разделить его следующим образом:

пункт:

****************
* 192.168.1.1
****************
ssh -q 192.168.1.1 ntpstat
synchronised to NTP server (192.168.204.1) at stratum 5
time correct to within 281 ms
polling server every 1024 s

пункт 2:

****************
* 192.168.1.3
****************
ssh -q 192.168.1.3 ntpstat
synchronised to NTP server (192.168.1.2) at stratum 12
time correct to within 57 ms
polling server every 1024 s

спасибо в заранее.

0
задан 6 July 2018 в 11:08

2 ответа

Если ваш входной файл - test.log, и вы хотите разбить его на каждую пустую строку, создав кучу пронумерованных test-XXX.log файлов, вы можете сделать это с помощью цикла Bash, например:

number=1
while read line ; do 
    echo "$line" >> "test-$number.log"
    if [[ -z "$line" ]] ; then 
        ((number++))
    fi
done < test.log 
[ 115] или сокращенно и в одну строку:

n=1;while read l;do echo "$l">>"test-$n.log";if [[ -z "$l" ]];then ((n++));fi;done<test.log

Считывает входной файл построчно и увеличивает счетчик каждый раз, когда встречает пустую строку на входе. Имя выходного файла, к которому добавляется каждая строка, содержит счетчик, так что данные попадают в разные файлы.

2
ответ дан 6 July 2018 в 11:08

Вы можете разбить файлы на записи, разделенные одной или несколькими пустыми строками, используя Awk в режиме абзаца , установив пустой разделитель записей RS

Затем можно создать числовое увеличение имена для частей, добавляя номер записи NR к базовому имени по вашему выбору:

awk -vRS= '{print > "paragraph" NR}' log.txt

Другой вариант будет использовать csplit с регулярным выражением /^$/, чтобы соответствовать пустой линии:

csplit -sz --prefix='paragraph' --suffix-format='%d' log.txt '/^$/' '{*}'

Вы можете опустить --prefix и --suffix-format, если не возражаете против последовательности имен файлов по умолчанию xx00, xx01 и т. д.

1
ответ дан 6 July 2018 в 11:08

Другие вопросы по тегам:

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