Linux文本处理三剑客:grep、sed、awk
Linux文本处理三剑客:grep、sed、awk
grep - 文本搜索
grep用于搜索文件中匹配指定模式的行。
基本用法
# 搜索包含error的行
grep "error" logfile
# 忽略大小写
grep -i "error" logfile
# 递归搜索目录
grep -r "error" /var/log/
# 显示行号
grep -n "error" logfile
# 反向匹配(不包含的行)
grep -v "error" logfile
# 统计匹配行数
grep -c "error" logfile
# 显示匹配的上下文
grep -C 3 "error" logfile # 前后3行
grep -A 3 "error" logfile # 后3行
grep -B 3 "error" logfile # 前3行
正则表达式
# 基本正则
grep "^error" logfile # 以error开头
grep "error$" logfile # 以error结尾
grep "^$" logfile # 空行
grep "[0-9]" logfile # 包含数字
# 扩展正则(-E)
grep -E "error|warning" logfile # 或
grep -E "err[0-9]+" logfile # 数字
sed - 流编辑器
sed用于对文本进行查找、替换、删除等操作。
基本操作
# 替换文本
sed 's/old/new/' file
# 全局替换
sed 's/old/new/g' file
# 原地修改文件
sed -i 's/old/new/g' file
# 删除行
sed '/pattern/d' file
# 删除指定行
sed '3d' file # 删除第3行
sed '1,5d' file # 删除1-5行
# 插入行
sed '3i\new line' file # 在第3行前插入
# 追加行
sed '3a\new line' file # 在第3行后追加
# 打印特定行
sed -n '5p' file # 打印第5行
sed -n '1,5p' file # 打印1-5行
高级用法
# 多个替换
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file
# 使用不同的分隔符
sed 's|/usr/local|/opt|g' file
# 引用匹配内容
sed 's/\(hello\) \(world\)/\2 \1/' file
# 条件执行
sed '/pattern/s/old/new/g' file
awk - 文本分析
awk是一种编程语言,适合处理结构化文本数据。
基本用法
# 打印特定列
awk '{print $1}' file
awk '{print $1, $3}' file
# 设置分隔符
awk -F: '{print $1}' /etc/passwd
# 条件过滤
awk '$3 > 100' file
awk '/error/' file
# 打印最后一列
awk '{print $NF}' file
# 打印行号
awk '{print NR, $0}' file
内置变量
| 变量 | 说明 |
|---|---|
| NR | 当前行号 |
| NF | 当前行字段数 |
| $0 | 整行内容 |
| $1-$n | 第1-n个字段 |
| FS | 输入字段分隔符 |
| OFS | 输出字段分隔符 |
高级用法
# 计算求和
awk '{sum += $1} END {print sum}' file
# 统计行数
awk 'END {print NR}' file
# 格式化输出
awk '{printf "%-20s %s\n", $1, $2}' file
# 处理CSV
awk -F',' '{print $1, $2}' data.csv
实践:日志分析脚本
#!/bin/bash
LOG="/var/log/nginx/access.log"
echo "=== 状态码统计 ==="
awk '{print $9}' $LOG | sort | uniq -c | sort -rn
echo ""
echo "=== 404错误的URL ==="
awk '$9 == 404 {print $7}' $LOG | sort | uniq -c | sort -rn | head -10
echo ""
echo "=== 请求量最大的IP ==="
awk '{print $1}' $LOG | sort | uniq -c | sort -rn | head -10
echo ""
echo "=== 按小时统计请求量 ==="
awk '{print $4}' $LOG | cut -d: -f2 | sort | uniq -c | sort -n
总结
grep、sed、awk是Linux文本处理的核心工具。掌握这三个工具,能够高效地处理日志分析、数据提取等任务。