Appearance
文本处理命令
概述
文本处理是Linux系统中的核心功能之一。Linux提供了丰富的文本处理工具,可以进行文件查看、搜索、编辑、排序、统计等各种操作。这些命令在日志分析、数据处理、系统管理等场景中发挥着重要作用。
文件查看命令
cat - 显示文件内容
功能:连接并显示文件内容,适合查看小文件。
语法:
bash
cat [选项] [文件...]
常用选项:
-n
:显示行号-b
:只对非空行显示行号-s
:压缩连续的空行为一行-T
:显示制表符为^I-E
:在每行末尾显示$-A
:等同于-vET,显示所有非打印字符
示例:
bash
# 显示文件内容
cat file.txt
# 显示多个文件
cat file1.txt file2.txt
# 显示行号
cat -n file.txt
# 输出:
# 1 第一行内容
# 2 第二行内容
# 3
# 4 第四行内容
# 只对非空行显示行号
cat -b file.txt
# 输出:
# 1 第一行内容
# 2 第二行内容
#
# 3 第四行内容
# 压缩空行
cat -s file.txt
# 创建文件(重定向)
cat > newfile.txt
# 输入内容,Ctrl+D结束
# 追加内容到文件
cat >> existingfile.txt
# 合并文件
cat file1.txt file2.txt > merged.txt
less/more - 分页查看文件
功能:分页显示文件内容,适合查看大文件。
less命令(推荐)
语法:
bash
less [选项] 文件
常用选项:
-N
:显示行号-S
:不换行显示长行-i
:搜索时忽略大小写-F
:如果文件小于一屏则直接显示并退出
交互操作:
空格键
:向下翻页b
:向上翻页j
或↓
:向下一行k
或↑
:向上一行g
:跳到文件开头G
:跳到文件末尾/pattern
:向下搜索?pattern
:向上搜索n
:下一个搜索结果N
:上一个搜索结果q
:退出
示例:
bash
# 查看文件
less file.txt
# 显示行号
less -N file.txt
# 不换行显示
less -S file.txt
# 查看命令输出
ps aux | less
ls -la | less
more命令
功能:类似less,但功能较少。
基本操作:
空格键
:向下翻页Enter
:向下一行q
:退出/pattern
:搜索
head - 显示文件开头
功能:显示文件的前几行,默认显示前10行。
语法:
bash
head [选项] [文件...]
常用选项:
-n 数字
:显示前n行-c 数字
:显示前n个字符-q
:多文件时不显示文件名-v
:总是显示文件名
示例:
bash
# 显示前10行(默认)
head file.txt
# 显示前5行
head -n 5 file.txt
head -5 file.txt # 简写形式
# 显示前100个字符
head -c 100 file.txt
# 查看多个文件
head file1.txt file2.txt
# 查看日志文件开头
head /var/log/syslog
# 结合管道使用
ls -la | head -5
tail - 显示文件结尾
功能:显示文件的后几行,默认显示后10行。
语法:
bash
tail [选项] [文件...]
常用选项:
-n 数字
:显示后n行-c 数字
:显示后n个字符-f
:实时跟踪文件变化(常用于日志监控)-F
:类似-f,但文件被删除重建时会重新打开-q
:多文件时不显示文件名-v
:总是显示文件名--pid=PID
:与-f配合,当指定进程结束时停止跟踪
示例:
bash
# 显示后10行(默认)
tail file.txt
# 显示后20行
tail -n 20 file.txt
tail -20 file.txt # 简写形式
# 显示后100个字符
tail -c 100 file.txt
# 实时监控日志文件(最常用)
tail -f /var/log/syslog
tail -f /var/log/apache2/access.log
# 从第10行开始显示到文件末尾
tail -n +10 file.txt
# 监控多个文件
tail -f file1.log file2.log
# 结合其他命令
ps aux | tail -5
文本搜索命令
grep - 文本搜索
功能:在文件中搜索匹配指定模式的行。
语法:
bash
grep [选项] 模式 [文件...]
常用选项:
-i
:忽略大小写-v
:反向匹配(显示不匹配的行)-n
:显示行号-c
:只显示匹配行的数量-l
:只显示包含匹配的文件名-r
或-R
:递归搜索目录-w
:匹配整个单词-x
:匹配整行-A n
:显示匹配行及其后n行-B n
:显示匹配行及其前n行-C n
:显示匹配行及其前后n行--color
:高亮显示匹配内容
示例:
bash
# 基本搜索
grep "error" log.txt
# 忽略大小写搜索
grep -i "ERROR" log.txt
# 显示行号
grep -n "error" log.txt
# 输出:15:Error: File not found
# 反向匹配
grep -v "debug" log.txt
# 统计匹配行数
grep -c "error" log.txt
# 输出:5
# 递归搜索目录
grep -r "TODO" /home/user/project/
# 匹配整个单词
grep -w "cat" file.txt # 不会匹配"catch"中的"cat"
# 显示匹配行的上下文
grep -A 3 -B 2 "error" log.txt # 显示匹配行前2行后3行
grep -C 3 "error" log.txt # 显示匹配行前后各3行
# 搜索多个文件
grep "pattern" *.txt
# 使用正则表达式
grep "^Error" log.txt # 以Error开头的行
grep "Error$" log.txt # 以Error结尾的行
grep "[0-9]\+" file.txt # 包含数字的行
# 结合管道使用
ps aux | grep "apache"
cat /etc/passwd | grep "user"
find - 查找文件
功能:在目录树中查找文件和目录。
语法:
bash
find [路径] [表达式]
常用选项:
-name
:按文件名查找-iname
:按文件名查找(忽略大小写)-type
:按文件类型查找(f=文件,d=目录,l=链接)-size
:按文件大小查找-mtime
:按修改时间查找-user
:按所有者查找-group
:按所属组查找-perm
:按权限查找-exec
:对找到的文件执行命令-delete
:删除找到的文件
示例:
bash
# 按名称查找
find /home -name "*.txt"
find . -name "config.conf"
# 忽略大小写查找
find /home -iname "*.TXT"
# 按类型查找
find /home -type f # 查找文件
find /home -type d # 查找目录
find /home -type l # 查找符号链接
# 按大小查找
find /home -size +100M # 大于100MB的文件
find /home -size -1k # 小于1KB的文件
find /home -size 50c # 正好50字节的文件
# 按时间查找
find /home -mtime -7 # 7天内修改的文件
find /home -mtime +30 # 30天前修改的文件
find /home -mtime 0 # 今天修改的文件
# 按权限查找
find /home -perm 755 # 权限为755的文件
find /home -perm -644 # 至少有644权限的文件
# 组合条件
find /home -name "*.log" -size +10M
find /home -type f -name "*.tmp" -mtime +7
# 执行操作
find /home -name "*.tmp" -delete
find /home -name "*.txt" -exec ls -l {} \;
find /home -name "*.log" -exec gzip {} \;
# 查找并复制
find /home -name "*.conf" -exec cp {} /backup/ \;
# 使用xargs提高效率
find /home -name "*.txt" | xargs ls -l
find /home -name "*.log" | xargs grep "error"
文本编辑和处理命令
sed - 流编辑器
功能:对文本进行流式编辑,可以进行替换、删除、插入等操作。
语法:
bash
sed [选项] '命令' [文件...]
常用选项:
-i
:直接修改文件-e
:指定多个编辑命令-n
:静默模式,只输出处理的行-r
:使用扩展正则表达式
常用命令:
s/old/new/
:替换d
:删除行p
:打印行a
:在行后添加i
:在行前插入c
:替换整行
示例:
bash
# 基本替换
sed 's/old/new/' file.txt # 替换每行第一个匹配
sed 's/old/new/g' file.txt # 替换所有匹配
sed 's/old/new/2' file.txt # 替换每行第二个匹配
# 直接修改文件
sed -i 's/old/new/g' file.txt
# 删除行
sed '3d' file.txt # 删除第3行
sed '2,5d' file.txt # 删除第2-5行
sed '/pattern/d' file.txt # 删除包含pattern的行
sed '/^$/d' file.txt # 删除空行
# 打印特定行
sed -n '3p' file.txt # 只打印第3行
sed -n '2,5p' file.txt # 只打印第2-5行
sed -n '/pattern/p' file.txt # 只打印匹配的行
# 添加和插入
sed '3a\新增行' file.txt # 在第3行后添加
sed '3i\插入行' file.txt # 在第3行前插入
sed '/pattern/a\新增行' file.txt # 在匹配行后添加
# 替换整行
sed '3c\新的第3行' file.txt # 替换第3行
sed '/pattern/c\新行' file.txt # 替换匹配的行
# 多个命令
sed -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt
sed 's/old1/new1/g; s/old2/new2/g' file.txt
# 使用正则表达式
sed 's/[0-9]\+/NUMBER/g' file.txt # 替换数字为NUMBER
sed 's/^[ \t]*//' file.txt # 删除行首空白
sed 's/[ \t]*$//' file.txt # 删除行尾空白
# 实用示例
# 注释配置文件中的某行
sed -i '/^DEBUG/s/^/#/' config.conf
# 取消注释
sed -i 's/^#\(.*DEBUG.*\)/\1/' config.conf
# 替换配置值
sed -i 's/^port=.*/port=8080/' config.conf
awk - 文本处理工具
功能:强大的文本处理和数据提取工具,特别适合处理结构化文本。
语法:
bash
awk [选项] 'program' [文件...]
awk [选项] -f script.awk [文件...]
基本结构:
bash
awk 'BEGIN{初始化} {处理每行} END{结束处理}' file
内置变量:
$0
:整行内容$1, $2, ...
:第1列、第2列等NF
:当前行的字段数NR
:当前行号FS
:字段分隔符(默认空格)OFS
:输出字段分隔符RS
:记录分隔符(默认换行)ORS
:输出记录分隔符
示例:
bash
# 打印特定列
awk '{print $1}' file.txt # 打印第1列
awk '{print $1, $3}' file.txt # 打印第1和第3列
awk '{print $NF}' file.txt # 打印最后一列
# 指定分隔符
awk -F: '{print $1}' /etc/passwd # 以冒号为分隔符
awk -F',' '{print $2}' data.csv # 处理CSV文件
# 条件处理
awk '$3 > 100' file.txt # 打印第3列大于100的行
awk '$1 == "root"' /etc/passwd # 打印第1列等于root的行
awk '/pattern/ {print $2}' file.txt # 匹配pattern的行,打印第2列
# 计算和统计
awk '{sum += $3} END {print sum}' file.txt # 计算第3列总和
awk '{count++} END {print count}' file.txt # 统计行数
awk '{sum += $3; count++} END {print sum/count}' file.txt # 计算平均值
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
awk '{print "Name: " $1 ", Age: " $2}' file.txt
# 使用BEGIN和END
awk 'BEGIN {print "开始处理"} {print NR, $0} END {print "处理完成"}' file.txt
# 多条件
awk '$3 > 100 && $4 < 50' file.txt
awk '$1 ~ /^[Aa]/ {print $0}' file.txt # 第1列以A或a开头
# 实用示例
# 分析日志文件
awk '{print $1}' access.log | sort | uniq -c | sort -nr # 统计IP访问次数
# 处理系统信息
ps aux | awk '{sum += $6} END {print "Total Memory: " sum/1024 " MB"}'
# 处理CSV文件
awk -F',' '{if(NR>1) print $2, $3}' data.csv # 跳过标题行
# 计算文件大小
ls -l | awk '{sum += $5} END {print "Total: " sum " bytes"}'
sort - 排序
功能:对文本行进行排序。
语法:
bash
sort [选项] [文件...]
常用选项:
-r
:逆序排序-n
:按数值排序-k
:指定排序字段-t
:指定字段分隔符-u
:去除重复行-f
:忽略大小写-o
:输出到文件-c
:检查是否已排序-m
:合并已排序的文件
示例:
bash
# 基本排序
sort file.txt
# 逆序排序
sort -r file.txt
# 数值排序
sort -n numbers.txt
# 按指定列排序
sort -k 2 file.txt # 按第2列排序
sort -k 2,2 file.txt # 只按第2列排序
sort -k 2n file.txt # 按第2列数值排序
sort -k 2r file.txt # 按第2列逆序排序
# 指定分隔符
sort -t: -k 3n /etc/passwd # 按UID排序
sort -t',' -k 2 data.csv # CSV文件按第2列排序
# 去重排序
sort -u file.txt
# 多字段排序
sort -k 1,1 -k 2n file.txt # 先按第1列字母序,再按第2列数值序
# 输出到文件
sort file.txt -o sorted.txt
# 检查排序
sort -c file.txt
# 实用示例
# 按文件大小排序
ls -l | sort -k 5n
# 按内存使用排序
ps aux | sort -k 6n
# 统计并排序
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -nr
uniq - 去重
功能:报告或删除重复行(需要先排序)。
语法:
bash
uniq [选项] [输入文件] [输出文件]
常用选项:
-c
:显示每行出现的次数-d
:只显示重复的行-u
:只显示不重复的行-i
:忽略大小写-f n
:忽略前n个字段-s n
:忽略前n个字符
示例:
bash
# 基本去重(需要先排序)
sort file.txt | uniq
# 统计重复次数
sort file.txt | uniq -c
# 输出:
# 3 apple
# 1 banana
# 2 orange
# 只显示重复的行
sort file.txt | uniq -d
# 只显示不重复的行
sort file.txt | uniq -u
# 忽略大小写
sort file.txt | uniq -i
# 实用示例
# 统计最常用的命令
history | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
# 统计日志中的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr
# 查找重复文件(按大小)
find /home -type f -exec ls -l {} \; | awk '{print $5, $9}' | sort | uniq -d
wc - 统计
功能:统计文件的行数、单词数、字符数。
语法:
bash
wc [选项] [文件...]
常用选项:
-l
:只显示行数-w
:只显示单词数-c
:只显示字节数-m
:只显示字符数-L
:显示最长行的长度
示例:
bash
# 完整统计
wc file.txt
# 输出: 100 500 3000 file.txt
# 行数 单词数 字节数 文件名
# 只统计行数
wc -l file.txt
wc -l *.txt # 统计多个文件
# 只统计单词数
wc -w file.txt
# 只统计字符数
wc -c file.txt
# 最长行长度
wc -L file.txt
# 实用示例
# 统计代码行数
find . -name "*.py" | xargs wc -l
# 统计日志大小
wc -c /var/log/*.log
# 统计用户数
wc -l /etc/passwd
# 结合管道使用
ps aux | wc -l # 统计进程数
ls | wc -l # 统计文件数
grep "error" log.txt | wc -l # 统计错误行数
实用技巧和最佳实践
1. 管道组合使用
bash
# 复杂的文本处理流水线
cat access.log | grep "404" | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
# 分析系统进程
ps aux | grep -v grep | awk '{print $11}' | sort | uniq -c | sort -nr
# 处理CSV数据
cat data.csv | sed '1d' | awk -F',' '{sum+=$3} END {print "Average:", sum/NR}'
2. 正则表达式技巧
bash
# 匹配IP地址
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file.txt
# 匹配邮箱地址
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
# 匹配日期格式
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" file.txt
3. 性能优化
bash
# 大文件处理时使用适当的工具
# 查看大文件开头
head -1000 largefile.txt
# 搜索大文件时使用grep而不是cat+grep
grep "pattern" largefile.txt # 好
cat largefile.txt | grep "pattern" # 不推荐
# 使用LC_ALL=C加速排序
LC_ALL=C sort largefile.txt
4. 数据处理模式
bash
# ETL模式:提取-转换-加载
# 提取
grep "ERROR" /var/log/app.log > errors.txt
# 转换
sed 's/.*\[\(.*\)\].*/\1/' errors.txt | \
awk '{print $1, $2}' > processed.txt
# 加载/分析
sort processed.txt | uniq -c | sort -nr > error_summary.txt
5. 调试和测试
bash
# 逐步构建复杂命令
cat file.txt # 第1步:查看原始数据
cat file.txt | grep "pattern" # 第2步:过滤
cat file.txt | grep "pattern" | awk '{print $2}' # 第3步:提取
# 使用head限制输出进行测试
cat largefile.txt | head -100 | grep "pattern" | awk '{print $2}'
常见问题和解决方案
1. 编码问题
问题:中文显示乱码
解决方案:
bash
# 检查文件编码
file -i file.txt
# 转换编码
iconv -f gbk -t utf-8 file.txt > file_utf8.txt
# 设置环境变量
export LANG=zh_CN.UTF-8
2. 大文件处理
问题:文件太大,处理缓慢
解决方案:
bash
# 分块处理
split -l 10000 largefile.txt chunk_
# 使用更高效的工具
# 用grep代替cat+grep
grep "pattern" largefile.txt
# 用awk代替多个管道
awk '/pattern/ {print $2}' file.txt
3. 内存不足
问题:sort命令内存不足
解决方案:
bash
# 使用临时目录
sort -T /tmp largefile.txt
# 限制内存使用
sort -S 1G largefile.txt
# 外部排序
sort --parallel=4 largefile.txt
总结
文本处理命令是Linux系统的核心工具,掌握这些命令对于系统管理、数据分析、日志处理等工作至关重要:
- 查看命令:
cat
、less
、head
、tail
- 查看文件内容 - 搜索命令:
grep
、find
- 查找文本和文件 - 编辑命令:
sed
、awk
- 文本编辑和处理 - 排序命令:
sort
、uniq
- 数据排序和去重 - 统计命令:
wc
- 文本统计
学习建议:
- 从简单的单命令开始,逐步学习组合使用
- 多练习正则表达式,提高搜索和替换效率
- 学会使用管道组合多个命令
- 针对大文件学习性能优化技巧
- 在实际工作中多应用,如日志分析、数据处理等
这些文本处理工具的熟练掌握将大大提高在Linux环境下的工作效率。