1.筛选IPv4地址
注:
- **FS** :**输入字段分隔符**,**默认为空白字符**
- RS :**输入记录分隔符**,指定输入时的换行符,原换行符仍有效
- **NF** :字段数量,**共有**多少字段, **$NF引用最后一列,$(NF-1)引用倒数第2列**
- **NR** :**行号**,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
2.统计TCP连接状态数量
注:
(1)BEGIN/END 模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{} :仅在文本处理完成之后执行
3.统计日志中各IP访问非200状态码的次数
4.根据某字段去重
注:
- -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式
- -v var=value:赋值一个用户定义变量,将外部变量传递给awk
- -f scripfile:从脚本文件中读取awk命令
5.处理字段缺失的数据
注:FIELDWIDTHS变量可以按照字符数量划分字段。
FIELDWIDTH第一行第一个字段是字符宽度ID为2,指定2个字符宽度,第二列字段最大为6,但前面和ID之间还有两个空格,所以可以指定宽度为8,也可以跳过两个字符2:6
6.次数统计
7.插入几个新字段
8.统计日志中前10个IP访问的次数
文本内容如上,没截完
9.
文本内容如8题
注:awk提供了mktime()函数,它可以将时间转换成epoch时间值。借此,可以取得日志中的时间字符串部分,再将它们的年、月、日、时、分、秒都取出来,然后放入mktime()构建成对应的epoch值。因为epoch值是数值,所以可以比较大小,从而决定时间的大小。
下面strptime2()实现的是将`10/Nov/2019:23:53:44+08:00`格式的字符串转换成epoch值,然后和which_time比较大小即可筛选出精确到秒的日志。
BEGIN{
# 要筛选什么时间的日志,将其时间构建成epoch值
which_time = mktime("2019 11 10 03 42 40")
}
{
# 取出日志中的日期时间字符串部分
match($0,"^.*\\[(.*)\\].*",arr)
# 将日期时间字符串转换为epoch值
tmp_time = strptime2(arr[1])
# 通过比较epoch值来比较时间大小
if(tmp_time > which_time){
print
}
}
# 构建的时间字符串格式为:"10/Nov/2019:23:53:44+08:00"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
dt_str = gensub("[/:+]"," ","g",str)
# dt_sr = "10 Nov 2019 23 53 44 08 00"
split(dt_str,arr," ")
Y=arr[3]
M=mon_map(arr[2])
D=arr[1]
H=arr[4]
m=arr[5]
S=arr[6]
return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}
function mon_map(str,mons){
mons["Jan"]=1
mons["Feb"]=2
mons["Mar"]=3
mons["Apr"]=4
mons["May"]=5
mons["Jun"]=6
mons["Jul"]=7
mons["Aug"]=8
mons["Sep"]=9
mons["Oct"]=10
mons["Nov"]=11
mons["Dec"]=12
return mons[str]
}