在linux环境中,xml文件常被用作服务配置、接口报文或元数据描述。当机器没有桌面环境时,我们需要通过命令行来查看和分析这些文件。单纯使用cat会把所有内容挤在一起,难以分辨层级关系,因此掌握专门的查看命令十分必要。

一、使用xmllint格式化查看
xmllint是libxml2工具集中的一个命令行程序,大多数linux发行版都预装了该工具。它不仅能把压缩成一行或者缩进混乱的xml重新排版,还能顺带做语法校验。如果文件本身格式有误,它会直接报错并指出行号,这对排查配置问题非常有帮助。
下面这条命令可以把example.xml以美观的树状结构打印到终端:
# 格式化输出xml内容 xmllint --format /etc/app/config.xml # 如果不关心格式,只检查语法是否正确 xmllint --noout /etc/app/config.xml
需要注意的是,在最小化安装的centos或ubuntu系统中,xmllint可能没有被默认带上,此时可以通过包管理器安装。例如在debian系执行apt-get install libxml2-utils,在redhat系执行yum install libxml2即可。
这种方式的优势是输出可读性强,且能发现隐藏的标签闭合错误;缺点是当文件特别大时,终端刷屏严重,不适合精确提取某个字段。
二、用grep提取关键节点文本
如果只想看某个标签里的数值,比如查找所有<username>节点,用grep配合正则表达式是最轻量的做法。它不需要额外依赖,只要系统有文本处理工具就能用。
我们可以写一个简单的正则来匹配标签及内容:
# 提取所有username标签内的文本 grep -oP '<username>K[^<]+' data.xml # 查看包含特定属性的行 grep 'id="1001"' record.xml
上面的-oP参数中,P代表使用perl兼容正则,K表示忽略前面匹配到的开始标签,只输出后面到下一个小于号之前的内容。这种方法在日志型xml里找字段很快。
不过grep毕竟只是行文本匹配,当标签跨行或者存在同名但不同层级的节点时,就容易误抓。它适合临时瞟一眼,不适合严谨的解析任务。
三、xmlstarlet按路径查询
xmlstarlet是一个功能完整的xml命令行工具箱,支持类似xpath的语法来精确定位节点。它相当于把编程语言里的xml解析能力搬到了shell里,对于复杂结构尤其有用。
以下示例展示了如何选出某个书本节点下的标题:
# 查询所有book节点下title的文本 xmlstarlet sel -t -v '//book/title' library.xml # 带条件过滤,价格大于30的书籍名 xmlstarlet sel -t -v '//book[price>30]/title' library.xml
第一条命令中的sel表示select模式,-v后面跟xpath表达式,工具会遍历文档输出结果。第二条利用了xpath的谓词过滤,比grep精准得多。
xmlstarlet的短处是多数系统不预装,需要手动安装,并且xpath语法有一定学习成本。但一旦熟悉,处理接口返回的xml报文会极其高效。
四、less结合格式化做交互浏览
当xml文件很大,又想边看边搜索,可以把xmllint的输出通过管道交给less。less支持上下翻页和斜杠搜索,比直接终端刷屏友好。
# 格式化后进入less交互视图 xmllint --format bigfile.xml | less
在less界面里输入斜杠加关键词就能高亮定位,按q退出。这个组合没有新工具依赖,只是把已有命令串起来,非常适合在跳板机上应急查看。
| 方式 | 是否预装 | 适合场景 |
|---|---|---|
| cat | 是 | 极小文件快速瞟一眼 |
| xmllint | 多数有 | 格式化与校验 |
| grep | 是 | 提取简单字段 |
| xmlstarlet | 否 | 复杂路径查询 |
综合来看,日常查看优先用xmllint格式化,精确取值用xmlstarlet,临时过滤用grep,三者互补基本能覆盖linux下命令行打开并查看xml文件的所有常见需求。