Linux常用命令学习笔记:tr

1. 命令概述

  • 命令名称tr(英文全拼:translate)
  • 核心功能字符转换和删除,对标准输入的字符进行替换、删除、压缩等操作
  • 主要用途:字符替换、大小写转换、删除字符、压缩重复字符
  • 特点:轻量级、高效、支持字符集和范围

2. 语法格式

tr [选项] 字符集1 字符集2
tr [选项] -d 字符集
tr [选项] -s 字符集

3. 常用选项

选项说明
-c使用字符集1的补集
-d删除字符集1中的字符
-s压缩重复字符
-t截断字符集1,使其长度等于字符集2
--help显示帮助信息
--version显示版本信息

4. 基本操作

(1) 字符替换

# 将小写字母转换为大写
echo "hello world" | tr 'a-z' 'A-Z'

# 将大写字母转换为小写
echo "HELLO WORLD" | tr 'A-Z' 'a-z'

# 将数字转换为星号
echo "12345" | tr '0-9' '*'

# 将空格转换为换行符
echo "a b c" | tr ' ' '\n'

# 将换行符转换为空格
echo -e "a\nb\nc" | tr '\n' ' '

(2) 删除字符

# 删除数字
echo "abc123def" | tr -d '0-9'

# 删除字母
echo "abc123def" | tr -d 'a-z'

# 删除标点符号
echo "hello, world!" | tr -d '[:punct:]'

# 删除空白字符
echo "hello   world" | tr -d '[:space:]'

# 删除非数字字符
echo "abc123def" | tr -cd '0-9'

(3) 压缩字符

# 压缩连续空格
echo "hello   world" | tr -s ' '

# 压缩连续换行符
echo -e "a\n\n\nb\nc" | tr -s '\n'

# 压缩连续制表符
echo -e "a\t\t\tb\tc" | tr -s '\t'

# 压缩连续相同字符
echo "aaabbbccc" | tr -s 'abc'

(4) 补集操作

# 删除非数字字符
echo "abc123def" | tr -cd '0-9'

# 删除非字母字符
echo "abc123def" | tr -cd 'a-zA-Z'

# 删除非打印字符
echo -e "hello\x01world" | tr -cd '[:print:]'

# 保留字母和数字
echo "abc123!@#" | tr -cd '[:alnum:]'

5. 常用实例详解

(1) 大小写转换

# 全部转换为大写
echo "Hello World" | tr '[:lower:]' '[:upper:]'

# 全部转换为小写
echo "Hello World" | tr '[:upper:]' '[:lower:]'

# 首字母大写(需要配合其他命令)
echo "hello world" | tr '[:lower:]' '[:upper:]' | sed 's/^\(.\)/\1/'

(2) 数字处理

# 提取数字
echo "abc123def456" | tr -cd '0-9'

# 提取电话号码
echo "Phone: 123-456-7890" | tr -cd '0-9'

# 格式化数字(每三位加逗号)
echo "1234567890" | rev | tr '0-9' '9876543210' | sed 's/.../&,/g' | rev | sed 's/^,//'

# 删除数字
echo "abc123def456" | tr -d '0-9'

(3) 空白字符处理

# 删除行首空格
echo "   hello" | tr -d '[:space:]'

# 删除行尾空格
echo "hello   " | tr -d '[:space:]'

# 删除所有空白字符
echo "hello   world" | tr -d '[:space:]'

# 压缩连续空格
echo "hello   world" | tr -s ' '

# 将制表符转换为空格
echo -e "hello\tworld" | tr '\t' ' '

(4) 特殊字符处理

# 删除控制字符
echo -e "hello\x01world" | tr -d '[:cntrl:]'

# 删除不可打印字符
echo -e "hello\x01world" | tr -cd '[:print:]'

# 删除标点符号
echo "hello, world!" | tr -d '[:punct:]'

# 删除字母和数字
echo "abc123!@#" | tr -d '[:alnum:]'

6. 实际应用场景

场景一:文本格式化

# 将文件内容转换为大写
tr 'a-z' 'A-Z' < file.txt

# 将文件内容转换为小写
tr 'A-Z' 'a-z' < file.txt

# 删除文件中的数字
tr -d '0-9' < file.txt

# 删除文件中的标点符号
tr -d '[:punct:]' < file.txt

# 压缩文件中的连续空格
tr -s ' ' < file.txt

场景二:数据清洗

# 提取CSV文件中的数字
cut -d, -f2 data.csv | tr -cd '0-9'

# 提取日志文件中的IP地址
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log | tr -d ' '

# 提取配置文件中的配置值
grep '^[^#]' config.conf | tr -d '[:space:]'

# 提取代码中的注释
grep '#' *.py | tr -d '[:space:]'

场景三:系统管理

# 统计文件行数(去除空行)
cat file.txt | tr -s '\n' | wc -l

# 统计单词数量
cat file.txt | tr -s ' ' '\n' | wc -l

# 统计字符数量(去除空格)
cat file.txt | tr -d '[:space:]' | wc -c

# 统计不同字符数量
cat file.txt | tr -cd '[:print:]' | fold -w1 | sort | uniq | wc -l

场景四:密码生成

# 生成随机密码(字母和数字)
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 12

# 生成随机密码(大小写字母和数字)
cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 16

# 生成随机密码(特殊字符)
cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*()' | head -c 20

# 生成随机字符串
cat /dev/urandom | tr -dc 'a-z' | head -c 8

7. 与其他命令的区别

命令特点适用场景
tr字符转换和删除字符替换、大小写转换
sed流编辑器,支持正则表达式复杂文本替换、删除
awk文本处理工具,支持字段处理复杂文本处理、报表生成
cut按列提取文本提取指定列
grep文本搜索工具模式匹配、搜索

8. 注意事项

  1. 字符集长度:字符集1和字符集2的长度应该相同,否则使用 -t选项截断
  2. 特殊字符:特殊字符需要转义或使用字符类
  3. 标准输入tr只能处理标准输入,不能直接处理文件
  4. 字符类:支持预定义的字符类,如 [:lower:][:upper:][:digit:]
  5. 性能tr处理速度很快,适合处理大文件

9. 常见问题解决

(1) 字符集长度不匹配

# 字符集1比字符集2长,使用-t选项截断
echo "abcdef" | tr -t 'abcdef' 'ABC'

# 字符集1比字符集2短,字符集2会被截断
echo "abcdef" | tr 'abc' 'ABC'

# 使用字符类
echo "abcdef" | tr 'a-z' 'A-Z'

(2) 特殊字符转义

# 转义换行符
echo "hello world" | tr ' ' '\n'

# 转义制表符
echo "hello world" | tr ' ' '\t'

# 转义回车符
echo "hello world" | tr ' ' '\r'

# 转义退格符
echo "hello world" | tr ' ' '\b'

(3) 字符类使用

# 使用预定义字符类
echo "Hello World" | tr '[:lower:]' '[:upper:]'

# 使用数字字符类
echo "abc123def" | tr -d '[:digit:]'

# 使用字母字符类
echo "abc123def" | tr -d '[:alpha:]'

# 使用空白字符类
echo "hello   world" | tr -s '[:space:]'

# 使用标点符号字符类
echo "hello, world!" | tr -d '[:punct:]'

(4) 多字符替换

# 替换多个字符
echo "abc123def" | tr 'abc' 'ABC'

# 替换字符范围
echo "abc123def" | tr 'a-z' 'A-Z'

# 替换非连续字符
echo "abc123def" | tr 'adf' 'ADF'

# 使用字符集
echo "abc123def" | tr 'abcdef' 'ABCDEF'

核心要点总结

  • tr是字符转换和删除工具,用于对标准输入的字符进行替换、删除、压缩等操作
  • 常用选项-d(删除字符)、-s(压缩重复字符)、-c(使用补集)
  • 字符类:支持预定义的字符类,如 [:lower:][:upper:][:digit:]
  • 实际应用:大小写转换、字符删除、空白字符处理、数据清洗
  • 注意事项:字符集长度应该相同,特殊字符需要转义

tr命令是Linux系统中最常用的文本处理工具之一,熟练掌握可以大大提高文本处理效率。


作 者:南烛
链 接:https://www.itnotes.top/archives/411
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇