Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将多行转换为一行并从中提取列_Bash_Perl_Awk - Fatal编程技术网

Bash 将多行转换为一行并从中提取列

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:

我有一个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: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]}'