6.2 Linux文本处理进阶(第16天)
核心目标
-
掌握AWK编程:深入理解AWK的工作模式(模式-动作),能够使用AWK对结构化文本数据进行过滤、计算、格式化输出。
-
掌握SED流编辑:熟练使用SED进行文本替换、删除、插入、转换等操作,实现批量文本处理。
-
应用实战:能够将AWK和SED灵活应用于渗透测试中的日志分析、扫描结果处理、数据提取与格式化。
模块一:AWK编程深入
1.1 AWK基本概念
-
工作模式 :
awk 'pattern {action}' file-
pattern:模式,用于匹配行。可省略,表示所有行。 -
{action}:动作,对匹配到的行执行的操作。可省略,默认为{print $0}。
-
-
内建变量:
-
$0:整行内容。 -
$1, $2, ...:第1、2...个字段(默认以空格/制表符分隔)。 -
NF:当前行的字段数。 -
NR:当前处理的行号。 -
FS:输入字段分隔符(默认空格)。 -
OFS:输出字段分隔符(默认空格)。
-
-
基本结构:
BEGIN { ... } # 在处理任何行之前执行一次 pattern { ... } # 对匹配pattern的每行执行 END { ... } # 在处理完所有行之后执行一次
1.2 AWK实战示例
-
基础打印:
awk '{print $1}' file.txt # 打印每行第一个字段 awk '{print $NF}' file.txt # 打印每行最后一个字段 awk 'NR==1, NR==5 {print $0}' file.txt # 打印第1到5行 -
条件过滤:
awk '$3 > 100' file.txt # 打印第三列大于100的行 awk '/error/ {print $0}' log.txt # 打印包含"error"的行 awk '$1 ~ /^192\.168/ {print $0}' # 打印第一列以192.168开头的行 -
字段计算与统计:
awk '{sum += $1} END {print sum}' numbers.txt # 对第一列求和 awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log # 统计IP出现次数 -
字段分隔符控制:
awk -F':' '{print $1}' /etc/passwd # 以冒号分隔,打印用户名 awk -F'[ :]' '{print $1, $2}' file # 以空格或冒号分隔
模块二:SED流编辑器深入
2.1 SED基本概念
-
工作模式 :
sed [options] 'command' filecommand:编辑命令,如s替换,d删除,p打印等。
-
常用选项:
-
-n:静默模式,只显示处理后的行。 -
-i:直接修改文件(谨慎!)。 -
-e:执行多个命令。
-
2.2 SED实战示例
-
替换操作:
sed 's/old/new/g' file.txt # 将每行所有old替换为new sed 's/old/new/2' file.txt # 将每行第2个old替换为new sed 's/^/HEAD: /' file.txt # 在每行开头添加HEAD: sed 's/$/ TAIL/' file.txt # 在每行结尾添加TAIL sed -n 's/.*error.*/&/p' log.txt # 打印包含error的行 -
删除操作:
sed '5d' file.txt # 删除第5行 sed '2,5d' file.txt # 删除第2到5行 sed '/^#/d' config.txt # 删除以#开头的行(注释) -
插入与追加:
sed '2i\Inserted Line' file.txt # 在第2行前插入一行 sed '2a\Appended Line' file.txt # 在第2行后追加一行 -
复杂编辑:
# 将文件中的"foo"替换为"bar",并将"hello"替换为"world" sed -e 's/foo/bar/g' -e 's/hello/world/g' file.txt # 删除从包含"START"的行到包含"END"的行 sed '/START/,/END/d' file.txt
模块三:AWK与SED在渗透测试中的实战应用
3.1 日志分析
-
提取Nmap扫描的开放端口:
grep "open" nmap_scan.txt | awk '{print $1}' | cut -d'/' -f1 | sort -u -
分析Apache访问日志,统计状态码:
awk '{print $9}' access.log | sort | uniq -c | sort -nr -
提取登录失败日志的IP:
grep "Failed password" auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
3.2 结果格式化
-
美化Nmap的Grepable输出:
grep "80/open" scan.gnmap | awk -F'[ ;]' '{print $2}' -
从
whois结果中提取组织名称:whois example.com | awk -F': ' '/^Organization:/ {print $2}'
3.3 数据清洗与转换
-
清理扫描结果中的无关行:
sed '/^#/d;/^$/d' scan_result.txt > cleaned.txt -
将IP列表转换为特定格式:
# 192.168.1.1 -> http://192.168.1.1 sed 's/^/http:\/\//' ips.txt
模块四:当日达标实战任务
4.1 AWK基础操作
-
字段提取 :使用
/etc/passwd文件,编写AWK命令,只输出用户名(第1列)和使用的Shell(第7列),格式为username -> shell。 -
条件过滤 :给定一个日志文件
sample.log,包含[INFO]、[WARN]、[ERROR]级别的日志。编写AWK命令,只输出[ERROR]级别的日志行。 -
数据统计 :给定一个文本文件
data.txt,每行一个数字。编写AWK命令,计算这些数字的总和、平均值、最大值和最小值。
4.2 SED基础操作
-
批量替换:创建一个包含多行文本的文件,将其中所有的"cat"替换为"dog",并将"red"替换为"blue"。
-
删除操作 :在一个配置文件中,删除所有空行和以
#开头的注释行。 -
插入内容 :在一个脚本文件的开头插入一行
#!/bin/bash。
4.3 综合实战
-
分析SSH登录日志 :使用提供的
auth.log样本,完成以下任务:-
提取所有"Failed password"事件的日期、时间和源IP地址。
-
统计每个源IP的失败尝试次数,并按次数降序排列。
-
找出所有"Accepted password"事件的用户名和源IP。
-
-
处理Nmap扫描结果 :给定一个
nmap -oG格式的输出文件,编写命令序列:-
提取所有开放了80或443端口的主机IP。
-
将IP列表格式化为
https://IP的形式,并保存到新文件。
-
模块五:常见问题与解决方案
5.1 AWK常见错误
-
字段引用错误 :
$0是整行,$1是第一个字段。注意分隔符FS的设置。 -
字符串与数字比较 :
"100"是字符串,100是数字。比较时注意类型,或使用+转换为数字。 -
模式匹配范围 :
awk '/start/,/end/'匹配从包含start的行到包含end的行。注意如果有多组,会匹配多次。
5.2 SED常见错误
-
原地修改风险 :
-i选项会直接修改原文件,务必先备份或测试。 -
特殊字符转义 :在替换命令
s中,/是分隔符,如果模式中包含/,需转义为\/或使用其他分隔符如|。 -
贪婪匹配 :
sed默认是贪婪匹配。例如,s/.*//会匹配到行尾。
明日预告 :第17天将深入HTTP状态码 的含义,并系统学习Burp Suite Intruder模块的四种攻击模式,实现高效的暴力破解、模糊测试和参数枚举。