Linux四剑客:find、grep、sed、awk 从入门到实战
一、Find:文件搜索神器
核心功能:在指定目录下搜索符合条件的文件/目录,支持按名称、类型、大小、时间、权限等条件筛选。
基础用法(80%场景够用)
1.按文件名搜索(支持通配符)
find 搜索路径 -name "文件名模式" # 区分大小写
find /home/user -name "*.txt" # 搜索所有 .txt 文件
find . -name "file?.txt" # 匹配 file1.txt、file2.txt 等(?代表单个字符)
✅ 进阶:不区分大小写用 -iname
,例如 find . -iname "*.JPG"
。
2.按文件类型搜索
find 路径 -type 类型 # f=普通文件,d=目录,l=符号链接
find /var/log -type f # 搜索日志目录下的所有普通文件
find /usr/bin -type l # 搜索二进制目录下的所有软链接
3.按文件大小搜索
find 路径 -size 大小 # +大于,-小于,单位:k/M/G(注意大写)
find /data -size +1G # 搜索大于1GB的文件
find ~ -size -10k # 搜索小于10KB的文件(小文件清理常用)
4.按修改时间搜索
find 路径 -mtime 天数 # -n表示近n天,+n表示n天前,n表示正好n天
find /var/log -mtime -7 # 搜索7天内修改过的日志文件(运维常用)
find . -mtime +30 # 搜索30天未修改的文件(清理旧文件)
进阶操作:对搜索结果执行命令
5.删除文件(谨慎!)
find /tmp -name "*.bak" -delete # 直接删除 .bak 文件(无需-exec)
# 安全做法:先预览再删除
find /tmp -name "*.bak" -print # 打印所有匹配文件
find /tmp -name "*.bak" -exec rm {} \; # 逐个删除({}代表文件名,\;是命令结束符)
6.限定搜索深度
find /home -maxdepth 2 -name "*.conf" # 仅在当前目录和子目录(1级深度)搜索配置文件
避坑指南
- 搜索路径用
.
代表当前目录,用/
代表整个系统(小心权限问题)。 -exec
后用{}
引用文件名,结尾必须加\;
或+
(+
表示批量执行,效率更高)。
二、Grep:文本搜索利器
核心功能:在文件或文本流中搜索匹配模式的行,支持正则表达式,常与管道结合使用。
基础用法(快速定位关键词)
1.搜索包含关键词的行
grep "关键词" 文件 # 区分大小写
grep -i "keyword" file.txt # 不区分大小写(i=ignore case)
2.递归搜索目录下所有文件
grep -r "error" /var/log # 在日志目录递归搜索包含"error"的行(排查故障常用)
3.反向匹配(排除关键词)
grep -v "无效行" file.txt # 显示不包含"无效行"的所有行(过滤干扰信息)
4.显示行号和完整单词匹配
grep -n "user" passwd # 显示匹配行的行号(n=number)
grep -w "root" passwd # 仅匹配完整单词(w=word,避免匹配"rootx"等)
进阶:正则表达式与高级选项
5.使用正则表达式
grep "^[0-9]" log.txt # 匹配以数字开头的行(^=行首)
grep "[0-9]$" log.txt # 匹配以数字结尾的行($=行尾)
grep "a.*b" log.txt # 匹配包含"a任意字符b"的行(.*=任意字符任意次)
6.统计匹配行数/文件名
grep -c "success" log.txt # 统计包含"success"的行数(c=count)
grep -l "error" /var/log/* # 仅列出包含"error"的文件名(l=list files)
实战场景
- 排查日志:
grep -r "ERROR" /var/log/
- 过滤配置文件:
grep -v "^#" config.ini
(排除注释行)
三、Sed:文本编辑魔术师
核心功能:流式处理文本(不修改原文件,除非用 -i
),支持替换、删除、插入行等操作。
基础操作:替换文本
1.单行替换(临时输出)
sed 's/旧内容/新内容/' 文件 # s=substitute,默认只替换每行第一个匹配项
sed 's/old/new/g' file.txt # g=global,替换每行所有匹配项(常用!)
2.直接修改文件(危险!建议备份)
sed -i 's/old/new/g' file.txt # i=in-place,直接修改文件(重要!操作前确认路径)
sed -i.bak 's/old/new/g' file # 备份原文件为 file.bak,再修改
行操作:删除、插入、追加
3.删除指定行
sed '3d' file.txt # 删除第3行(d=delete)
sed '/error/d' file.log # 删除所有包含"error"的行
4.在匹配行前后插入内容
sed '/开头行/i 插入内容' file # i=insert,在匹配行之前插入(i=before)
sed '/结尾行/a 追加内容' file # a=append,在匹配行之后追加(a=after)
进阶:处理空白行与多命令
5.删除空白行/首尾空格
sed '/^$/d' file.txt # 删除所有空白行(^$表示空行)
sed 's/^[ \t]*//;s/[ \t]*$//' file # 去除每行首尾空格(分号分隔多个命令)
6.执行多个编辑命令
sed -e 's/old/new/g' -e 's/bad/good/g' file # -e支持多个命令(链式操作)
避坑指南
- 正则中的特殊字符(如
$
、/
)需用\
转义,例如sed 's/$/\\n/' file
。 - 使用
-i
前务必确认文件路径,建议先通过无-i
命令预览结果。
四、Awk:文本处理瑞士军刀
核心功能:按行处理结构化数据(如日志、CSV),支持数据提取、统计、计算等复杂操作。
基础:按列处理数据
1.打印指定列(默认分隔符为空格/制表符)
awk '{print $1}' file.txt # 打印第1列($0=整行,$1=第1列,$NF=最后一列)
awk -F',' '{print $2}' data.csv # -F指定分隔符为逗号,打印CSV文件第2列
2.过滤与条件判断
awk '$3 > 100' sales.csv # 打印第3列数值大于100的行(数值比较)
awk '/error/{print $0}' log.txt # 打印包含"error"的整行(模式匹配)
进阶:统计与变量
3.计算总和/平均值
awk '{sum += $1} END {print sum}' numbers.txt # 累加第1列,END表示处理完所有行后执行
awk '{avg += $1} END {print avg/NR}' numbers.txt # NR=行数,计算平均值
4.自定义输出格式
awk -F':' '{printf "用户:%s,UID:%s\n", $1, $3}' /etc/passwd # 格式化输出(类似C语言printf)
实战案例
- 分析日志:统计访问量最高的IP
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -nrk2
- 处理配置文件:提取端口号
awk -F'[:=]' '/port/ {print $3}' config.conf # 按冒号或等号分割,取第3列
核心概念
- 内置变量:
NR
(当前行号)、NF
(列数)、FS
(字段分隔符,默认空格)。 - 执行流程:逐行读取文件,对每行应用
pattern { action }
,无pattern则处理所有行。
五、四剑客对比与场景选择
工具 | 核心功能 | 典型场景 |
---|---|---|
find | 搜索文件/目录 | 查找日志文件、清理旧文件 |
grep | 搜索文本中的模式 | 日志排查、配置文件过滤 |
sed | 文本替换、行操作 | 批量修改配置、清洗数据 |
awk | 结构化数据处理 | 统计分析、报表生成 |
六、学习建议
- 从案例入手:每个工具先掌握5个基础案例(如find找文件、grep搜关键词、sed替换、awk取列)。
- 多用管道:结合四剑客与其他命令(如
find ... | grep
、sed ... | awk
),提升效率。 - 善用帮助:通过
man 工具
查看官方文档,或用工具 --help
快速查看参数。 - 实战练习:处理真实场景(如清理日志、分析CSV数据),遇到问题用搜索引擎找具体案例。
通过以上步骤,初学者可快速掌握四剑客的核心用法,应对80%的日常文本处理需求。进阶功能可在实战中逐步学习,重点关注工具的组合使用!