在服务器上排查问题的时候,XML文件出现的频率相当高,Tomcat的server.xml、Maven的pom.xml、各类Spring配置文件都是XML格式。很多人习惯直接用cat pom.xml看一眼内容,结果终端里输出的是一整片白花花的文字,标签和文本值完全分不清,文件一长眼睛很快就花了。其实cat本身不带语法高亮功能,但围绕这个需求,Linux下有好几种成熟的替代方案,可以做到带颜色输出,甚至顺带把混乱的XML格式化成缩进清晰的样子。下面逐一介绍这些方法,并分析它们各自适合的场景。

方法一:用xmllint格式化并高亮XML
xmllint是libxml2工具包的一部分,绝大多数Linux发行版的软件源里都有,它最主要的功能是校验和格式化XML。单纯执行xmllint --format server.xml,终端会输出一份缩进整齐的XML,虽然默认不带颜色,但结构已经比cat的原始输出清晰太多了。如果安装了配合的着色工具,还可以用管道组合实现高亮。
先确认安装:Debian或Ubuntu下执行sudo apt install libxml2-utils,CentOS下执行sudo yum install libxml2。安装完成后执行格式化命令即可:
# 格式化输出,自动整理缩进 xmllint --format server.xml # 去掉全部空白节点,压缩成紧凑内容 xmllint --noblanks server.xml # 校验XML语法是否正确,出错位置会直接提示 xmllint --noout server.xml
如果还想叠加颜色效果,可以把xmllint的输出交给pygments处理,这个会在后面讲到。xmllint的另一个优势是排错能力强,当XML有标签未闭合、转义字符错误等问题时,它会精确报告出错的行号,这一点比单纯看文本要高效得多。
方法二:用vim以只读方式打开实现语法高亮
vim内置了XML语法文件,打开文件后标签名、属性、字符串会自动呈现不同颜色。如果只是想看而不想改,可以用view命令,它是vim的只读模式别名,打开后按q即可退出,不用担心误改文件。这个方案不需要额外装任何东西,因为绝大多数服务器本来就带着vim。
打开后还可以按几个快捷键提升阅读体验:在普通模式下按gg回到文件开头,按G跳到文件末尾,输入:set nonumber可以关掉行号腾出更多显示空间。如果文件编码是GBK而终端是UTF-8,出现乱码时输入:e ++enc=gbk重新按GBK编码加载即可。用法示例如下:
# 只读方式打开,带语法高亮 view pom.xml # 等价写法 vim -R pom.xml # 打开后指定编码重新加载 :e ++enc=gbk
这种方式适合文件不太大、需要仔细阅读的场景。它的缺点是不是管道友好的,没法把高亮结果传给grep之类的工具做二次过滤,所以更多是替代less而非cat。如果服务器上连vim都没有,GNU source-highlight是一个更轻量的选择,后面会提到。
方法三:用pygments实现cat风格的高亮输出
如果坚持想要cat那种直接把内容打到终端的体验,同时又要颜色,pygments是最合适的工具。它是Python的语法高亮库,自带一个命令行脚本pygmentize,能识别几百种格式,XML自然不在话下。安装方式:
# 安装pygments pip install pygments # 直接高亮输出XML文件,效果类似带颜色的cat pygmentize -l xml server.xml # 配合格式化工具,先整理缩进再着色 xmllint --format server.xml | pygmentize -l xml # 高亮的同时显示行号 pygmentize -l xml -g -O style=monokai pom.xml
-O style=monokai可以切换配色主题,pygments内置了多种风格,比如colorful、vim、native等,选一个自己看着舒服的就行。管道组合是最推荐的用法:xmllint负责把结构理顺,pygmentize负责上色,两者叠加后阅读体验接近图形化编辑器。
用得多了之后,建议在~/.bashrc里定义一个别名,比如alias catxml='xmllint --format $1 | pygmentize -l xml',不过alias传参有限制,更稳妥的写法是封装成函数:
# 写入 ~/.bashrc 后执行 source ~/.bashrc
catxml() {
xmllint --format "$1" | pygmentize -l xml -O style=monokai
}
之后在任何目录敲catxml pom.xml就能得到格式化加高亮的输出,习惯上和cat完全一致,几乎零学习成本。
几种方案对比与选择建议
前面介绍的三种方案各有侧重,简单对比一下。view或vim的方式零依赖、交互性强,适合精读;xmllint擅长格式化和语法校验,适合排查结构问题;pygmentize最贴近cat的使用习惯,适合快速浏览。此外还有GNU source-highlight,安装后用source-highlight -s xml -f esc server.xml也能输出ANSI颜色,功能类似pygmentize,属于备选项。
实际工作中的组合策略可以这样安排:日常快速看一眼用封装好的catxml函数;怀疑文件有语法错误时先跑一遍xmllint --noout定位问题;需要逐段分析长文件时再上view配合搜索。对于超大文件(比如上百MB的数据导出XML),任何高亮工具都会变慢,这种情况建议先用head -n 200 file.xml截取片段再处理,或者直接用grep提取关心的标签。
还有一个容易忽略的细节:有些XML文件是GBK或GB2312编码,pygmentize处理时可能报解码错误,这时可以先用iconv -f gbk -t utf-8 old.xml > new.xml转码再高亮。把编码问题提前处理好,能避免大量莫名其妙的输出异常。掌握这几个小工具之后,在纯终端环境下阅读XML配置文件不再是件费眼睛的事。