← 返回首页
🔤

Linux文本处理三剑客:grep、sed、awk

📂 devops ⏱ 2 min 322 words

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文本处理的核心工具。掌握这三个工具,能够高效地处理日志分析、数据提取等任务。