ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 文本三剑客实操指南:grep / sed / awk

Linux 文本三剑客实操指南:grep / sed / awk 一、准备测试数据bashcat /tmp/test.log EOF 2024-01-15 10:23:45 ERROR [user-service] Failed to login: useralice ip192.168.1.10 2024-01-15 10:24:01 INFO [user-service] User login success: userbob ip192.168.1.11 2024-01-15 10:25:12 ERROR [order-service] Payment timeout: order1001 amount99.9 2024-01-15 10:26:33 WARN [order-service] Retry payment: order1001 attempt2 2024-01-15 10:27:45 INFO [order-service] Payment success: order1001 amount99.9 2024-01-15 10:28:10 ERROR [user-service] Failed to login: useralice ip192.168.1.10 2024-01-15 10:29:55 DEBUG [cache-service] Cache hit ratio: 0.85 EOF二、grep —— 查找过滤1. 基础用法bash# 查找 ERROR 行 grep ERROR /tmp/test.log # 忽略大小写 grep -i error /tmp/test.log # 显示行号 grep -n ERROR /tmp/test.log # 反向匹配不包含 grep -v INFO /tmp/test.log # 统计匹配行数 grep -c ERROR /tmp/test.log2. 正则与多条件bash# 扩展正则-E匹配 ERROR 或 WARN grep -E ERROR|WARN /tmp/test.log # 匹配多个关键字与 grep ERROR /tmp/test.log | grep alice # 只输出匹配部分 grep -oE user[a-z] /tmp/test.log # 递归查找目录 grep -rn ERROR /var/log/3. 常用组合bash# 上下文前2行后3行 grep -B2 -A3 Payment timeout /tmp/test.log # 只列出文件名 grep -l ERROR *.log # 静默模式脚本中判断是否存在 if grep -q ERROR /tmp/test.log; then echo 有错误; fi三、sed —— 流编辑器增删改查1. 替换最常用bash# 替换第一个匹配 sed s/ERROR/ERR/ /tmp/test.log # 全局替换 sed s/ERROR/ERR/g /tmp/test.log # 直接修改文件-i sed -i s/ERROR/ERR/g /tmp/test.log sed -i.bak s/ERROR/ERR/g /tmp/test.log # 备份 # 指定行范围替换 sed 1,3s/INFO/INFORMATION/ /tmp/test.log # 只替换匹配行的内容先定位再替换 sed /alice/s/192.168.1.10/10.0.0.1/ /tmp/test.log2. 删除bash# 删除第 3 行 sed 3d /tmp/test.log # 删除 2-4 行 sed 2,4d /tmp/test.log # 删除包含 DEBUG 的行 sed /DEBUG/d /tmp/test.log # 删除空行 sed /^$/d /tmp/test.log # 删除行尾空白 sed s/[[:space:]]*$// /tmp/test.log3. 插入与追加bash# 在第 1 行前插入 sed 1i\ LOG START /tmp/test.log # 在匹配行后追加 sed /ERROR/a\ 需要关注 /tmp/test.log # 替换整行 sed /DEBUG/c\DEBUG 行已被替换 /tmp/test.log4. 打印控制bash# 只打印匹配行-n 抑制默认输出 sed -n /ERROR/p /tmp/test.log # 打印 2-4 行 sed -n 2,4p /tmp/test.log # 打印最后一行 sed -n $p /tmp/test.log5. 提取内容分组bash# 提取 userxxx sed -n s/.*user\([a-z]*\).*/\1/p /tmp/test.log # 提取 IP sed -n s/.*ip\([0-9.]*\).*/\1/p /tmp/test.log四、awk —— 文本分析按列处理1. 基础字段操作bash# 打印第 1、3 列默认空格分隔 awk {print $1, $3} /tmp/test.log # 打印整行 awk {print $0} /tmp/test.log # 指定分隔符-F awk -F {print $1} /tmp/test.log # 打印行号 内容 awk {print NR: $0} /tmp/test.log # 打印最后一列 awk {print $NF} /tmp/test.log2. 条件过滤bash# 打印 ERROR 行 awk /ERROR/ /tmp/test.log # 打印第 3 列是 ERROR 的行 awk $3ERROR /tmp/test.log # 多个条件 awk $3ERROR $4 ~ /user-service/ /tmp/test.log # 数值比较 awk $1 100 data.txt # 取反 awk $3!INFO /tmp/test.log3. 统计计算bash# 统计 ERROR 行数 awk /ERROR/{count} END{print count} /tmp/test.log # 按日志级别统计 awk {level[$3]} END{for (l in level) print l, level[l]} /tmp/test.log # 求和 awk {sum$NF} END{print sum} numbers.txt # 求平均 awk {sum$1; n} END{print sum/n} numbers.txt # 求最大/最小值 awk NR1{max$1} $1max{max$1} END{print max} numbers.txt4. 格式化输出bash# BEGIN/END 块 awk BEGIN{print 结果 } {print $1} END{print 结束 } /tmp/test.log # printf 格式化 awk {printf %-10s %s\n, $3, $1} /tmp/test.log # 指定输出分隔符 awk BEGIN{OFS|} {print $1, $3, $4} /tmp/test.log5. 实用技巧bash# 提取 IP 并统计出现次数 awk {for(i1;iNF;i) if($i ~ /ip/){gsub(ip,,$i); print $i}} /tmp/test.log | sort | uniq -c # 按服务统计 ERROR 数量 awk /ERROR/{gsub(/\[|\]/,,$4); svc[$4]} END{for(s in svc) print s, svc[s]} /tmp/test.log # 打印每行字段数 awk {print NR, NF} /tmp/test.log五、三剑客组合实战场景 1统计 ERROR 日志里各服务的数量并排序bashgrep ERROR /tmp/test.log | awk {print $4} | sed s/\[//;s/\]// | sort | uniq -c | sort -rn场景 2提取支付超时的订单号和金额bashgrep Payment timeout /tmp/test.log | awk {for(i1;iNF;i){if($i~/^order/)o$i; if($i~/^amount/)a$i} print o, a}场景 3把日志格式换成 CSVbashawk {print $1,$2,$3,$4} /tmp/test.log /tmp/test.csv场景 4找出重复登录失败的用户及次数bashgrep Failed to login /tmp/test.log | sed -n s/.*user\([a-z]*\).*/\1/p | sort | uniq -c | sort -rn场景 5删除日志中的敏感 IPbashsed -i -E s/ip[0-9.]/ip***.***.***.***/g /tmp/test.log场景 6按小时统计日志量bashawk {print substr($2,1,2)} /tmp/test.log | sort | uniq -c六、三剑客选型口诀需求推荐找行 / 过滤grep替换 / 删除行 / 插入sed按列处理 / 统计 / 计算awk找行后替换grep sed找行后按列统计grep awk复杂分析awk 单独搞定核心记忆grep 查sed 改行级awk 算列级
返回列表