按照段落分开日志文本?

按照段落分开日志文本?
****************
* 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

提前致谢。

答案1

如果您的输入文件是,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 

或者缩写为一行:

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

它会逐行读取输入文件,每次遇到输入中的空行时都会增加计数器。每行附加到的输出文件名都包含计数器,因此数据最终位于不同的文件中。

答案2

您可以使用 Awk 将文件拆分为记录,并用一个或多个空行分隔,段落模式通过设置空的记录分隔符RS

NR然后,您可以通过将记录编号附加到您选择的基本名称来为作品创建数字递增的名称:

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

另一种选择是使用csplit正则表达式/^$/来匹配空行:

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

如果您不介意默认文件名序列等,您可以省略--prefixand 。--suffix-formatxx00xx01

相关内容