当前位置:首页>Linux>Linux三剑客(grep/sed/awk)常用实战命令

Linux三剑客(grep/sed/awk)常用实战命令

  • 2026-08-24 06:21:38
Linux三剑客(grep/sed/awk)常用实战命令

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' {} \;

小贴士

  1. 记住常用选项:

    • grep: -i(忽略大小写), -v(反向), -r(递归), -n(行号)

    • sed: -i(直接修改), -n(静默模式), -e(多表达式)

    • awk: -F(设置分隔符)

  2. 测试命令时:先不加-i选项,确认结果正确后再使用-i

  3. 复杂操作:可以先写在小文件或使用echo "test" | command测试

  4. 性能优化:对于大文件,awk通常比sed+grep组合更快

  5. 学习资源:

    # 查看详细帮助
    man grep
    info sed
    awk--help

最新文章

随机文章