Bash 将多行转换为一行并从中提取列
我有一个xml格式的日志流(来自名为mytool的安抚工具),我需要让它们在一行中看起来可读。我在这个节点上没有xml解析工具,所以最终使用了perl和awk 我设法得到了期望的结果,但希望尽可能减少管道/awk/perl的数量 输入流的示例:Bash 将多行转换为一行并从中提取列,bash,perl,awk,Bash,Perl,Awk,我有一个xml格式的日志流(来自名为mytool的安抚工具),我需要让它们在一行中看起来可读。我在这个节点上没有xml解析工具,所以最终使用了perl和awk 我设法得到了期望的结果,但希望尽可能减少管道/awk/perl的数量 输入流的示例: ./mytool <ALERT> <Time>2018-10-24T16:03:00.128-05:00</Time> <Alert>0;2018-10-24T16:02:37.739-05:
./mytool
<ALERT>
<Time>2018-10-24T16:03:00.128-05:00</Time>
<Alert>0;2018-10-24T16:02:37.739-05:00;NODE_LOCATION=19;11193;ID=5636122;Temp is on critical range;000;CRITICAL;Recovery=Shutting down the node;100</Alert>
</ALERT>
<ALERT>
<Time>2018-10-24T16:03:03.053-05:00</Time>
<Alert>0;2018-10-24T16:02:40.264-05:00;NODE_LOCATION=17;11293;ID=5636124;Temp is on Major range;000;MAJOR;Recovery=Shutdown the node or it will auto shutdown,processes stopped;99</Alert>
</ALERT>
我用于获取结果的当前命令:
./mytool | perl -000 -lnpe 's/<.*?>|NODE_LOCATION=|Recovery=|ID=//g' | awk -vRS= '{$1=$1}1' |awk -F';' '{print $2,$$4,$5,$6,$8,$9}'
2018-10-24T16:02:37.739-05:00 5636122 Temp is on critical range CRITICAL Shutting down the node
2018-10-24T16:02:40.264-05:00 5636124 Temp is on Major range MAJOR Shutdown the node or it will auto shutdown,processes stopped
/mytool | perl-000-lnpe的/| NODE_LOCATION=| Recovery=|ID=/g'| awk-vRS='{$1=$1}1'| awk-F';''{打印$2、$$4、$5、$6、$8、$9}'
2018-10-24T16:02:37.739-05:00 5636122温度处于临界范围临界关闭节点
2018-10-24T16:02:40.264-05:00 5636124温度处于主范围主关闭节点,否则将自动关闭,进程停止
注意:请理解,使用awk perl并不是处理XML的最佳方法,但这是最好的方法,因此必须妥协 请尝试以下内容(考虑到您的脚本输出将始终与显示的输出保持相同的模式)
您的|u命令| awk-F”[>请尝试以下内容(考虑到您的脚本输出将始终与显示的输出保持相同的模式)
您的_命令| awk-F”[>如果需要,您可以用Perl完成所有操作。避免使用管道连接到awk
。例如:
mytool | perl -nE '
m{<Alert>(.*?)</Alert>} and do {($line = $1) =~ s/NODE_LOCATION=|Recovery=|ID=//g;
@F = split /;/, $line; say join " ", @F[1,3,4,5,6,7,8]}'
mytool | perl-nE'
m{(.*)}和do{($line=$1)=~s/NODE_LOCATION=|Recovery=|ID=//g;
@F=split/;/,$line;说join“@F[1,3,4,5,6,7,8]}”
如果需要,您可以使用Perl完成所有操作。避免使用管道连接到awk
。例如:
mytool | perl -nE '
m{<Alert>(.*?)</Alert>} and do {($line = $1) =~ s/NODE_LOCATION=|Recovery=|ID=//g;
@F = split /;/, $line; say join " ", @F[1,3,4,5,6,7,8]}'
mytool | perl-nE'
m{(.*)}和do{($line=$1)=~s/NODE_LOCATION=|Recovery=|ID=//g;
@F=split/;/,$line;说join“@F[1,3,4,5,6,7,8]}”
mytool | perl-nE'if(//){s/Recovery=|ID=/g;say join”“(split//)[1,4,5,7,8]}
假设您的XML每行只有一个标记对(如您的示例中所示),上述方法将起作用。mytool | perl-nE'if(//){s/Recovery=|ID=///g;say join”“(split/;/)[1,4,5,7,8]}
假设您的XML每行只有一个标记对(如示例中所示),上述方法将起作用
mytool | perl -nE '
m{<Alert>(.*?)</Alert>} and do {($line = $1) =~ s/NODE_LOCATION=|Recovery=|ID=//g;
@F = split /;/, $line; say join " ", @F[1,3,4,5,6,7,8]}'
mytool | perl -nE 'if(/<Alert>/){s/Recovery=|ID=//g; say join " ",(split/;/)[1,4,5,7,8]}'