用于从日志

时间:2015-05-14 03:53:14

标签: xml bash sed

我有一个嵌入了xml的日志文件,我正在尝试使用sed解析它。发生的事情是,我正在获取所需的xml,但是在获取所需的xml之后,该行。这是一个示例文件

2015-05-06 04:07:37.386 [INFO]Process:102 - Application submitted Successfully ==== 1
<APPLICATION> <NAME> test </NAME> </APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:103 - Application completed Successfully ==== 1

我正在使用的sed命令是

sed -n '/<APPLICATION>/,/<\/APPLICATION>/p' batchlog.txt  >> np.out

如上所述,我得到了所需的XML,但也得到了它后面的行。我该如何避免这种情况?

这个问题的第二部分是,如果我在shell脚本中使用它,那么处理每个xml块的最有效方法是什么(文件中可能存在许多“APPLICATION”块的实例。是替换每个块中包含的xml标记中的一些值并重写文件,使用标记中的新值保持原始内容BUT。对于这部分,示例如下。在shell脚本中,我是解析日志文件,当我遇到APPLICATION标签时,我想屏蔽其中带有SSN的任何标签的值。例如:

<APPLICATION><FirstName>Test<FirstName><StudentSSN>123456789</StudentSSN><Address>123 Test Street</Address><ParentSSN>123456780</ParentSSN></APPLICATION>

现在,当脚本针对日志文件运行时,它需要查看任何* SSN标记并将值替换为*。在命令行上执行以下sed命令,我可以获取studentSSN标记。

sed -n 's:.*<\StudentSSN>\(.*\)</StudentSSN.*:\1:p'

但是我希望将它变成通用的,以便父SSN和studentSSN被拾取,替换并用旧的非xml行和XML中的这些新值写回到文件中。所以修改后的文件看起来像这样:

2015-05-06 04:07:37.386 [INFO]Process:102 - Application submitted Successfully ==== 1
<APPLICATION><FirstName>Test<FirstName><StudentSSN>*********</StudentSSN><Address>123 Test Street</Address><ParentSSN>*********</ParentSSN></APPLICATION>
2015-05-06 04:07:39.386 [INFO] Process:103 - Application completed Successfully ==== 1

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

?

这会将任何sed处理限制为包含开始和结束sed -r '/<(APPLICATION>).*<\/\1/!b;:a;s/(<((Student|Parent)SSN>)\**)[^*](.*<\/\2)/\1*\4/;ta' file 标记的那些行。

APPLICATION的{​​{1}}或Student Parent个标记中的每个字符都被SSN替换。这是通过使用*命令检查成功替换并循环回*占位符来完成的,直到不再发生替换为止。

N.B。正则表达式使用反向引用甚至后引用中的后引用(因此需要ta开关使最终解决方案更容易被容忍)。

答案 1 :(得分:0)

以下内容将修复您的sed,以便输出所需的行:

sed -n '/<APPLICATION>.*<\/APPLICATION>/p' batchlog.txt  >> np.out

打印:

<APPLICATION> <NAME> test </NAME> </APPLICATION>

使用给定的输入