标签搜索

grep/sed/awk实用案例

mrui
2025-09-09 / 0 评论 / 3 阅读 / 正在检测是否收录...

使用grep分析nginx日志

# 统计访问最多的IP
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort | uniq -c | sort -nr | head -10

# 查找可疑的爬虫请求
grep -i "bot\|spider\|crawler" access.log | grep -v "Googlebot"

# 分析404错误的URL
grep " 404 " access.log | awk '{print $7}' | sort | uniq -c | sort -nr

# 查找大文件下载请求
grep -E " [0-9]{8,} " access.log | awk '$10 > 10000000 {print $1, $7, $10}'

#查找当天出现错误码400和500开头最多的访客地址
grep "$(date '+%d/%b/%Y:%H')" access.log | grep -E " (4|5)[0-9]{2} " | wc -l

sed配置文件批量修改

# 修改nginx配置中的端口
sed -i 's/listen 80/listen 8080/g' /etc/nginx/sites-available/*

# 批量替换数据库连接配置
sed -i 's/localhost:3306/db.example.com:3306/g' /var/www/*/config/*.php

# 注释掉配置文件中的某些行
sed -i '/^debug/s/^/#/' /etc/myapp/config.ini

# 去掉配置文件中的注释行和空行
sed -i '/^#/d; /^$/d' config.conf

#批量修改100多个配置文件的数据库地址
find /var/www -name "database.php" -exec sed -i 's/old-db-server/new-db-server/g' {} \;

awk分析nginx访问日志

# 统计每个IP的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

# 统计状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 计算平均响应大小
awk '{sum += $10; count++} END {print "Average size:", sum/count " bytes"}' access.log

# 分析访问时间分布
awk '{print substr($4, 14, 2)}' access.log | sort | uniq -c | sort -nr

# 找出响应时间最长的请求(需要nginx配置记录响应时间)
awk '$NF > 1.0 {print $1, $7, $NF}' access.log | sort -k3 -nr | head -10

awk分析系统日志

# 统计不同级别的日志数量
awk '{print $5}' /var/log/messages | sort | uniq -c

# 分析内存使用情况(从free命令输出)
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'

# 分析磁盘使用情况
df -h | awk '$5 > 80 {print "Warning: " $1 " is " $5 " full"}'

脚本:awk分析系统性能

#!/bin/bash
# 系统性能分析脚本

echo "=== CPU使用率 ==="
top -bn1 | grep "Cpu(s)" | awk '{print "CPU使用率: " $2}' | sed 's/%us,//'
#-b:表示批处理模式(batch mode)。在批处理模式下,top命令不会以交互式方式运行,而是直接将输出打印到标准输出(stdout)。这样便于将top的输出重定向到文件或通过管道传递给其他命令进行处理。

#-n:后面需要跟一个数字,表示top命令运行的迭代次数(iterations)。例如,-n1表示只运行一次迭代(即刷新一次)就退出。

echo "=== 内存使用情况 ==="
free -m | awk 'NR==2{printf "内存使用: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2}'

echo "=== 磁盘使用情况 ==="
df -h | awk '$5+0 > 80 {print "警告: " $1 " 使用率 " $5}'

echo "=== 网络连接统计 ==="
ss -tuln | awk '
BEGIN {tcp=0; udp=0}
/^tcp/ {tcp++}
/^udp/ {udp++}
END {print "TCP连接: " tcp; print "UDP连接: " udp}
'

echo "=== 最占CPU的进程 ==="
ps aux | awk 'NR>1 {print $11, $3}' | sort -k2 -nr | head -5

分析网站攻击

# 找出可疑的攻击IP
grep "$(date '+%d/%b/%Y')" access.log | \
grep -E " (4[0-9]{2}|5[0-9]{2}) " | \
awk '{print $1}' | \
sort | uniq -c | \
awk '$1 > 100 {print $2, $1}' | \
sort -k2 -nr
#grep筛选今天的日志
#grep找出4xx和5xx错误
#awk提取IP地址
#sort和uniq统计每个IP的错误次数
#awk筛选错误超过100次的IP
#sort按错误次数排序

清理日志文件

# 清理30天前的日志,只保留错误信息
find /var/log -name "*.log" -mtime +30 | while read file; do
    grep -E "(ERROR|FATAL|Exception)" "$file" | \
    sed 's/^[0-9-]* [0-9:]*//' | \
    awk '!seen[$0]++' > "${file}.clean"
done

生成监控报告

#!/bin/bash
# 生成每日访问报告

LOG_FILE="/var/log/nginx/access.log"
REPORT_DATE=$(date '+%d/%b/%Y')

echo "=== $REPORT_DATE 访问报告 ==="

echo "总访问量:"
grep "$REPORT_DATE" $LOG_FILE | wc -l

echo "独立IP数:"
grep "$REPORT_DATE" $LOG_FILE | awk '{print $1}' | sort -u | wc -l

echo "状态码分布:"
grep "$REPORT_DATE" $LOG_FILE | \
awk '{print $9}' | \
sort | uniq -c | \
sort -nr | \
sed 's/^[ ]*//' | \
awk '{printf "%-10s %s\n", $2, $1}'

echo "热门页面TOP10:"
grep "$REPORT_DATE" $LOG_FILE | \
grep " 200 " | \
awk '{print $7}' | \
sort | uniq -c | \
sort -nr | \
head -10 | \
sed 's/^[ ]*//' | \
awk '{printf "%-50s %s\n", $2, $1}'
0

评论 (0)

取消