xml - 如何使用 Bash 将具有 4 个 xml 节点的日志文件拆分为 4 个文件?

标签 xml linux bash awk

我需要将一个具有 4 个节点的 XML 文件拆分为 4 个文件。给定一个这样的文件:

sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
   <aNode>v</aNode>
   <otherNode a="2"/>
</aRoot>
kjfsdfj
20:15:59 r: <otherRoot>
   <bNode>h</bNode>
</otherRoot>
sddskjdsfds
asdadsa
22:31:32 st: <aRoot>
   <aNode>a</aNode>
   <otherNode a="1"/>
</aRoot>
kjfsdfj
22:31:39 r: <otherRoot>
   <bNode>o</bNode>
</otherRoot>
other-random-lines

我需要将它分成 4 个文件:* aRoot_1.xml , aRoot_2.xml , otherRoot_1.xml , otherRoot_2.xml .

到目前为止我已经取得了:

awk '/st:/,/<\/aRoot>/' file.txt > all_aRoots.txt

<otherRoot> 的类似方法: 另一个电话 awk , 写信给 all_otherRoots.txt

但这会保留 </aroot> 之前的所有字符, 并导致所有 <aRoot>outputfile .

如何使用 Bash 将具有 4 个 xml 节点的日志文件拆分为 4 个文件? 更新 #1: 请注意非 xml 行,必须将它们排除在外,并且,如果可能,以非 xml 文本开头的 XML 行必须仅保留 XML 部分

更新#2: 来自 RavinderSingh13 答案的示例输出文件:

sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
   <aNode>v</aNode>
   <otherNode a="2"/>

最佳答案

能否请您尝试以下。

awk -F"[><]" '
/^<\//{
  out_file=ind"_"array[ind]".xml"
  print val > (out_file)
  close(out_file)
  val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
  ind=$(NF-1)
  array[$(NF-1)]++
}
{
  val=(val?val ORS:"")$0
}
'  Input_file


编辑:添加代码以删除 OP 开始不需要的行。

awk -F"[><]" '
/^<\//{
  out_file=ind"_"array[ind]".xml"
  flag=1
  if(val){
    print val > (out_file)
  }
  close(out_file)
  val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
  ind=$(NF-1)
  array[$(NF-1)]++
}
flag{
  val=(val?val ORS:"")$0
}
'  Input_file

关于xml - 如何使用 Bash 将具有 4 个 xml 节点的日志文件拆分为 4 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58108785/

相关文章:

linux - 如何制作备份虚拟机

linux - shellscript从文件中读取变量

c - shell(bash) 如何在 linux 中工作,即它如何处理后台运行进程

macos - .bash_profile 中 `$PATH` 导出的末尾或开头的 `PATH`(对于 Mac 上的 Git)

arrays - PHPStorm 提示数组变量的简单使用

xml - Groovy XML MarkupBuilder 不创建根 <?xml .... ?>

php - 从 xml 中删除子节点

Javascript 二维数组问题 - 所有元素都是最终条目的副本

android - 如何在 RelativeLayout 中将一个 View 放置在另一个 View 之上?

bash - 使用已定义的 Content-Type 从 .sh 脚本运行 curl