1. grep 文本搜索
基本搜索
# 搜索包含"error"的行
grep"error" logfile.txt
# 忽略大小写
grep-i"error" file.txt
# 显示行号
grep-n"pattern" file.txt
# 显示不匹配的行
grep-v"pattern" file.txt
# 递归搜索目录
grep-r"search_text" /path/to/dir/
正则表达式
# 使用扩展正则表达式
grep-E"error|warning" file.txt
# 搜索以"start"开头的行
grep"^start" file.txt
# 搜索以"end"结尾的行
grep"end$" file.txt
# 搜索包含数字的行
grep"[0-9]" file.txt
# 搜索空行
grep"^$" file.txt
实用组合
# 搜索并显示匹配行的前后3行
grep-A3-B3"pattern" file.txt
# 统计匹配次数
grep-c"pattern" file.txt
# 只显示匹配的部分(而非整行)
grep-o"pattern" file.txt
# 多文件搜索并显示文件名
grep-H"pattern" *.txt
2. sed 流编辑器
基本替换
# 替换第一个匹配
sed's/old/new/' file.txt
# 替换所有匹配
sed's/old/new/g' file.txt
# 替换第N次出现的匹配
sed's/old/new/2' file.txt
# 替换并直接修改文件(加-i选项)
sed-i's/old/new/g' file.txt
# 备份原文件并修改
sed-i.bak 's/old/new/g' file.txt
删除操作
# 删除包含"pattern"的行
sed'/pattern/d' file.txt
# 删除空行
sed'/^$/d' file.txt
# 删除第5行
sed'5d' file.txt
# 删除第10-20行
sed'10,20d' file.txt
# 删除最后一行
sed'$d' file.txt
插入/追加
# 在第3行前插入
sed'3i\插入的内容' file.txt
# 在第3行后追加
sed'3a\追加的内容' file.txt
# 在匹配行后追加
sed'/pattern/a\新行内容' file.txt
高级用法
# 多重操作
sed-e's/foo/bar/'-e'/baz/d' file.txt
# 使用其他分隔符(处理路径时有用)
sed's|/old/path|/new/path|g' file.txt
# 只对匹配模式的行进行替换
sed'/pattern/s/old/new/g' file.txt
# 打印特定行范围
sed-n'10,20p' file.txt
3. awk 文本处理
基本打印
# 打印整行
awk'{print}' file.txt
# 打印第一列
awk'{print $1}' file.txt
# 打印多列
awk'{print $1, $3}' file.txt
# 打印最后一列
awk'{print $NF}' file.txt
# 打印倒数第二列
awk'{print $(NF-1)}' file.txt
条件筛选
# 第一列等于"value"的行
awk'$1 == "value"' file.txt
# 第三列大于100的行
awk'$3 > 100' file.txt
# 包含"text"的行
awk'/text/' file.txt
# 多条件
awk'$1 == "start" && $2 > 10' file.txt
# 使用正则表达式
awk'$1 ~ /^[0-9]+$/' file.txt
内置变量
# 打印行号
awk'{print NR, $0}' file.txt
# 打印字段数
awk'{print NF, $0}' file.txt
# 打印文件名
awk'{print FILENAME, $0}' file.txt
# 设置字段分隔符
awk-F: '{print $1}' /etc/passwd
awk-F'[;,]''{print $1}' file.txt # 多个分隔符
计算和统计
# 求和第三列
awk'{sum += $3} END {print sum}' file.txt
# 计算平均值
awk'{sum += $1; count++} END {print sum/count}' file.txt
# 分组统计
awk'{count[$1]++} END {for (item in count) print item, count[item]}' file.txt
# 求最大最小值
awk'NR==1 {max=$3; min=$3} $3>max {max=$3} $3<min {min=$3} END {print "Max:", max, "Min:", min}' file.txt
BEGIN和END块
# 添加表头
awk'BEGIN {print "Name Score"} {print $1, $2}' file.txt
# 格式化输出
awk'BEGIN {printf "%-10s %-10s\n", "Name", "Score"} {printf "%-10s %-10s\n", $1, $2}' file.txt
# 汇总统计
awk'{sum+=$2} END {printf "平均分: %.2f\n", sum/NR}' scores.txt
4. 组合使用实例
管道组合
# 查找进程并获取PID
ps aux | grep"nginx" | grep-vgrep | awk'{print $2}'
# 统计日志中不同错误类型的数量
grep"ERROR" app.log | awk'{print $5}' | sort | uniq -c | sort-nr
# 提取IP地址并排序
grep-oE'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log | sort | uniq -c
# 替换并过滤
sed's/old/new/g' file.txt | grep"pattern"
文件处理
# 删除文件中的空白行
sed'/^$/d' input.txt > output.txt
# 提取CSV文件的特定列
awk-F',''{print $1, $3}' data.csv
# 批量重命名文件
ls *.txt | sed's/\(.*\)\.txt/mv "&" "\1_backup.txt"/' | sh
# 统计代码行数(排除空行和注释)
grep-v'^$'source.py | grep-v'^#' | wc-l
5. 实用场景示例
日志分析
# 分析Nginx访问日志(统计访问最多的IP)
awk'{print $1}' access.log | sort | uniq -c | sort-nr | head -10
# 查找最近一小时的错误
grep"$(date -d '1 hour ago' '+%H:%M')" error.log
# 统计HTTP状态码
awk'{print $9}' access.log | sort | uniq -c
系统监控
# 监控内存使用前10的进程
ps aux --sort=-%mem | head -11
# 查看磁盘使用率超过90%的分区
df -h | awk'$5 > 90'
# 实时监控日志(tail + grep)
tail -f app.log | grep"ERROR"
数据处理
# 提取JSON中的特定字段(简单情况)
grep-o'"name":"[^"]*"' data.json | sed's/"name":"\(.*\)"/\1/'
# CSV转TSV
sed's/,/\t/g' input.csv > output.tsv
# 批量修改文件内容
find . -name"*.js"-execsed-i's/foo/bar/g' {} \;
小贴士
记住常用选项:
grep: -i(忽略大小写), -v(反向), -r(递归), -n(行号)
sed: -i(直接修改), -n(静默模式), -e(多表达式)
awk: -F(设置分隔符)
测试命令时:先不加-i选项,确认结果正确后再使用-i
复杂操作:可以先写在小文件或使用echo "test" | command测试
性能优化:对于大文件,awk通常比sed+grep组合更快
学习资源:
# 查看详细帮助
man grep
info sed
awk--help