作为Linux运维工程师,我们每天都要和各类文本打交道——日志分析、配置文件修改、数据筛选、批量替换,这些场景几乎贯穿了日常工作的方方面面。提到文本处理,大家最先想到的可能是老牌三剑客grep、sed、awk,但有一个轻量级命令常常被忽略,它就是tr命令。它不支持复杂的正则表达式,但胜在简洁高效、上手简单,处理字符替换、删除、压缩等基础需求时,比sed/awk更轻便,非常适合用于一行命令解决一个问题的场景。tr(全称translate,翻译/转换)是Linux系统中一款字符转换工具,核心功能是对标准输入(stdin)进行字符级别的替换、删除、压缩,输出处理后的结果(stdout)。核心特点的是:只处理字符,不处理整行;不修改原文件,只输出处理结果(如需修改原文件,需结合重定向)。选项:控制处理方式(替换、删除、压缩等),是tr命令的核心;输入方式:可直接通过管道(|)传递输入,也可结合重定向读取文件。1. 字符替换(最核心用法):将字符集1中的每个字符,依次替换为字符集2中对应的字符(一一对应,长度需一致,否则多余字符会被忽略)。比如:大小写转换、符号替换、错误字符修正。示例1:大小写转换(运维日志分析常用)# 小写转大写(将a-z替换为A-Z)cat /var/log/nginx/access.log | tr 'a-z' 'A-Z'# 大写转小写echo "ERROR: CONNECTION FAILED" | tr 'A-Z' 'a-z'示例2:替换文件中的特定符号(配置文件修正)# 将配置文件中的中文逗号(,)替换为英文逗号(,),避免语法错误cat config.conf | tr ',' ',' > config_new.conf
2. 字符删除(-d选项):删除输入中所有属于字符集1的字符,无需字符集2。比如:删除日志中的特殊符号、多余空格、无用字符。示例1:删除日志中的空格和制表符(便于批量提取数据)# 删除access.log中的所有空格(包括普通空格和制表符\t)cat /var/log/nginx/access.log | tr -d ' \t'示例2:删除字符串中的数字(提取纯文本)# 从备份文件名中删除数字,提取基础文件名echo "backup_20260225.tar.gz" | tr -d '0-9' # 输出:backup_.tar.gz
3. 字符压缩(-s选项):将输入中连续出现的相同字符,压缩为单个字符(仅压缩字符集1中的字符)。比如:清理日志中的连续空行、连续符号,简化文本格式。示例1:压缩日志中的连续空行(日志格式化)# 将/var/log/messages中的连续空行,压缩为单个空行cat /var/log/messages | tr -s '\n'# 同时删除空格和压缩空行(常用组合)cat /var/log/messages | tr -d ' ' | tr -s '\n'示例2:压缩连续的符号(清理异常日志)# 清理日志中连续的“---”符号,压缩为单个“-”echo "ERROR-----CONNECTION LOST" | tr -s '-'
然而日常工作中,单一用法往往不够用,tr的选项组合能解决更复杂的文本处理需求,以下3种组合是运维高频用法。1. 删除+替换组合(-d + 字符替换):先删除无用字符,再替换目标字符,一步完成多步处理。# 需求:清理日志中的特殊符号(@、#、$),再将小写error转为大写ERRORcat /var/log/app.log | tr -d '@#$' | tr 'error' 'ERROR'
2. 反向匹配删除(-c选项):-c表示“反向匹配”,即删除不属于字符集1的所有字符(结合-d使用)。比如:提取文件中的特定类型字符(如仅保留数字、仅保留字母)。# 示例1:仅保留日志中的数字(提取端口、IP段、时间戳)cat /var/log/nginx/access.log | tr -cd '0-9'# 示例2:仅保留字母和空格(过滤日志中的符号、特殊字符)cat /var/log/app.log | tr -cd 'a-zA-Z '
3. 换行符与其他符号转换:运维中常需要将换行转为空格(或反之),便于批量处理数据(如提取所有IP,用空格分隔)。# 示例1:将换行符(\n)转为空格,把多行数据合并为一行# 用途:提取所有连接IP,用空格分隔,便于后续用awk提取cat /var/log/nginx/access.log | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | tr '\n' ' '# 示例2:将空格转为换行符,把一行数据拆分为多行# 用途:将批量输入的IP,拆分为每行一个,便于统计数量echo "192.168.1.1 192.168.1.2 192.168.1.3" | tr ' ' '\n'
--------------分割线--------------tr命令是Linux运维工程师的轻量文本处理神器,它没有sed/awk的复杂语法,但在字符替换、删除、压缩等基础场景中,效率更高、上手更快。在日常工作中多尝试、多套用实战案例,熟练掌握后,能节省大量文本处理时间,省下的时间可以帮老板做更多的事,然后老板再安排给你更多的事……哦豁了。