排查特权用户
找出系统中UID为 0 的账户(通常只有 root,排查非root 特权账户)
awk -F: '$3 == 0 {print $1}' /etc/passwd
解析:
- -F::以冒号 :作为字段分隔符(/etc/passwd 格式为 用户名:密码占位符:UID:GID:描述:家目录:登录Shell)
- $3 == 0 : 判断第三字段(UID)是否等于0
- {print $1} :打印第一字段(用户名)
统计日志中访问量最多的IP并排序
分析 Web 日志(如 Nginx/Apache),找出请求量最高的客户端 IP
awk '{print $1}' 日志文件 | sort | uniq -c | sort -nr
解析
- awk ‘{print $1}’ :默认以空格分隔,提取第一字段(通常是IP)
- sort :对IP进行排序(为uniq -c 准备)
- uniq -c:统计重复行出现的次数
- sort -nr :按次数降序排序(-n 按数值,-r 反转结果)
目的
识别DDoS攻击源,等等
Web服务器通常日志位置
- Nginx:
/var/log/nginx/access.log
/usr/local/nginx/logs/access.log
- Apache:
/var/log/apache2/access.log
/var/log/httpd/access_log
统计访问次数最多的文件或目录
分析最常被访问的 URL 路径(资源)
awk '{print $7}' 日志文件 | sort | uniq -c | sort -nr
解析
- awk ‘{print $7}’:提取第七字段(通常请求的是URL路径)
- 后面同上
目的
排查恶意扫描路径
awk详解
awk 是一种强大的文本处理工具和编程语言,专门用于在 Linux/Unix 系统中处理结构化文本数据
工作原理
- 逐行扫描输入(文件或数据流)
- 按指定分隔符将每行拆分成字段($1,$2,…)
- 对符合特定模式的行执行动作
- 支持BEGIN(处理前执行)和END(处理后执行)块
基本语法
awk [选项] '模式{动作}' 输入文件
内置变量
变量 | 说明 | 示例 |
---|---|---|
$0 | 整行内容 | {print $0} |
$1 ~ $n | 第n个字段 | {print $1} |
NF | 当前行的字段数量 | {print $NF}(打印最后一个字段) |
NR | 当前行号(所有文件累计) | NR > 10 {print}(打印10行后的内容) |
FNR | 当前文件的行号 | {print FNR, $0} |
FS | 输入字段分隔符(默认空格) | BEGIN{FS=" : "} |
OFS | 输出字段分割符(默认空格) | BEGIN{OFS=" - "} |
RS | 输入记录分割符(默认 \n) | BEGIN{FS=" ; "} |
模式匹配
- 正则表达式:/error/ {print} (匹配包含“error”的行)
- 比较表达式:$3 > 100 {print $1} (第三列值大于100)
- 范围模式:/start/, /end/ {print} (匹配两个模式之间的行)
- 特殊模式:
- BEGIN : 处理前执行 (初始化)
- END : 处理后执行(汇总)
动作
- 打印输出:{print $1, $3}
- 计算机操作:{sum += $1}
- 流程控制:if/else,for,while
- 字符串操作:length($1),substr($1,2,4),gsub(/old/ ,“new”, $1)
grep详解
grep 是 Linux/Unix 系统中强大的文本搜索工具,用于在文件或标准输入中查找匹配指定模式的行。其名称源自 global regular expression print(全局正则表达式打印)
基本语法
grep [选项] 模式 [文件...]
核心功能
1.基础文本搜索
grep "111" 123.txt #在 123.txt 中查找包含 "111" 的行
2.多文本搜索
grep "111" 222.txt 333.txt #同时在两个文件中搜索
3.标准输入管道
cat 123.txt | grep "111" #从管道输入数据从而搜索
常用选项
选项 | 作用 | 示例 |
---|---|---|
-i | 忽略大小写 | grep -i “hello” file.txt |
-v | 反向匹配(显示不包含模式的行) | grep -v “success” data.log |
-n | 显示匹配行的行号 | grep -n “bug” code.py |
-c | 统计匹配行数(不显示内容) | grep -c “GET” access.log |
-r/-R | 递归搜索目录下的文件 | grep -r “main()” src/ |
-l | 仅显示包含匹配项的文件名 | grep -l “deprecated” *.js |
-w | 匹配完整单词(非子串) | grep -w “port” config.txt |
-A NUM | 显示匹配行及后 NUM 行 | grep -A 2 “Exception” error.log |
-B NUM | 显示匹配行及前 NUM 行 | grep -B 1 “FAILED” test.log |
-C NUM | 显示匹配行前后各 NUM 行 | grep -C 3 “timeout” debug.log |
-o | 仅输出匹配的部分 | grep -o “user_[0-9]+” ids.txt |
-E | 使用扩展正则表达式(同 egrep) | grep “mem(ory|leak)” report.txt |
-F | 按字面字符串匹配(禁用正则) | grep -F “*.log” files.txt |
–color | 高亮显示匹配文本 | grep --color “critical” app.log |
正则表达式
grep 默认支持基本正则表达式(BRE),使用 -E 启用扩展正则表达式(ERE)
字符 | 作用 | 示例 |
---|---|---|
. | 匹配任意字符 | a.c 匹配 abc、aac |
* | 前一个字符0次或多次 | lo*se 匹配 lse、lose、loose |
^ | 行首锚点 | ^start 匹配以 “start” 开头的行 |
$ | 行尾锚点 | end$ 匹配以 “end” 结尾的行 |
[ ] | 字符集 | [aeiou] 匹配任意元音字母 |
\ | 转义特殊字符 | \ . 匹配实际的点号 |
扩展正则表达式(-E)额外支持:
字符 | 作用 | 示例 |
---|---|---|
+ | 前一个字符1次或多次 | no+ 匹配 no、nooo |
? | 前一个字符0或1次 | colou?r 匹配 color 或 colour |
() | 分组匹配 | (abc)+ 匹配 abc、abcabc |
head详解
head 是 Linux/Unix 系统中用于查看文件开头部分内容的实用命令,默认显示文件前 10 行。它是文本处理的常用工具,尤其适合快速预览大型文件
基本语法
head [选项] 文件名
核心选项详解
1. -n <行数> :指定显示的行数
head -n 10 123.txt # 显示前 10 行
head -10 111.txt # 简写形式(部分系统支持)
2. -c <字节数> :指定显示的字节数
head -c 20 111.txt # 显示前 20 字节
head -c 1k 111.txt # 显示前 1KB(支持 K/KB, M/MB, G/GB 单位)
3. -v 或 --verbose:显示文件名标题
head -v -n 3 222.txt 333.txt
4. -q 或 --quiet:隐藏文件名标题(默认行为)
head -q -n 3 222.txt 333.txt # 直接输出内容,无文件名分隔
高级用法
1.处理多个文件
head -n 4 222.txt 333.txt # 分别显示每个文件前 4 行
2.从管道读取数据
grep "111" 123.txt | head -n 5
3. 显示除最后 N 行外的所有内容
head -n -5 111.txt