分隔符
awk的分隔符有两种
-
输入分隔符,awk默认是空格,空白字符,英文是field separator,变量名是FS
-
输出分隔符,output field separator,简称OFS
FS输入分隔符
awk逐行处理文本的时候,以输入分割符为准,把文本切成多个片段,默认符号是空格;当我们处理特殊文件,没有空格的时候,可以自由指定分隔符
写法1: -F '分隔符' ,例:
awk -F '#' '{print $1}' chaoge.txt
除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-V选项搭配,修改FS变量
写法2: -v FS='分隔符' ,例:
awk -v FS='#' '{print $1}' chaoge.txt
awk命令
1、特点与应用场景
类似于C语言的一门语言,用于过滤、统计、计算,统计日志等
2、awk执行过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUHEdvIF-1687827777530)(…/…/…/temp/Typora/image-20230621085327406.png)]
执行过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qq4BPuJ-1687827777532)(…/…/…/temp/Typora/image-20230620081610281.png)]
awk命令执行过程
3、行与列
名词 | awk中叫法 | 说明 |
---|---|---|
行 | 记录 record | 每一行默认通过 回车 分割 |
列 | 字段,域 field | 每一列默认通过 空格 分割 |
注:awk中 行与列 结束标记都是可以修改的
3.1 取行
写法 | 含义 |
---|---|
NR==1 | 取出第一行 |
NR>=1 && NR<=5 | 取出1到5行符合条件的数据 |
/XXX/ | 过滤包含XXX的行 |
/XXX/,/YYY/ | 过滤包含XXX的行 与 过滤包含YYY的行 |
常用符号:> < >= <= == !=
例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s3hlEJKk-1687827777533)(…/…/…/temp/Typora/image-20230620082400526.png)]
3.2取列
- -F 指分隔符 指定每一列结束标记(默认是空格)
- $数字 :取出某一列
- {print XXX} :表示打印
注:$0
表示取出所有列,即整行内容 ; $NF
表示取出最后一列
例:column -t表示对齐显示
ls -l |awk '{print $5,$NF}'|column -t
练习:#使用awk调换passwd 第1列和最后一列内容,然后显示每一行内容(调换后的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mqBp9M8S-1687827777534)(…/…/…/temp/Typora/image-20230620083541388.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8sifmTeO-1687827777535)(…/…/…/temp/Typora/image-20230620084038688.png)]
3.3小结
- 行与列名称
- awk取行与取列,指哪打哪
- 练习:取出网卡ip地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlpAqFfZ-1687827777536)(…/…/…/temp/Typora/image-20230620084408398.png)]
4、awk模式匹配
- 谁可以作为awk的条件
命令 | 选项 | ‘模式{动作}’ 或叫 ‘条件{动作}’ ‘pattern{action}’ |
---|---|---|
awk | -F“[/]+” | ‘NR==3{print $3}’ |
- 比较符号: > < >= <= == !=
- 正则
- 范围 表达式
- 特殊条件:BEGIN 与 END
4.1比较表达式
命令解析awk -F"[/]+" 'NR==3{print $3}'
命令 | 选项 | ‘模式{动作}’ 或叫 ‘条件{动作}’ ‘pattern{action}’ |
---|---|---|
awk | -F“[/]+” | ‘NR==3{print $3}’ |
4.2正则
- 支持正则扩展
- awk可以精确到某一列(包含xxx 或不包含XX内容)
- 包含:~
- 不包含:!~
正则 | awk正则 |
---|---|
**^**表示以…开头的行 | 例: $3~/^oldboy/ 表示第三列以oldboy开头的行 |
**$**表示以…结尾的行 | 例: 4 / l i d a o 4~/lidao 4 /lidao/ 表示第4列以lidao结尾的行 |
**^$**表示空行 | 某一列是空的(很少用) |
示例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DyxGiFcW-1687827777537)(…/…/…/temp/Typora/image-20230620085210765.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaZ0sr52-1687827777537)(…/…/…/temp/Typora/image-20230620085336653.png)]
4.3表示范围
常用
/开始/,/结束/
NR==1, NR==5
表示从第1行到第5行 类似sed -n '1,5p'
例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmaBeyTz-1687827777538)(…/…/…/temp/Typora/image-20230626084842174.png)]
4.4特殊模式:BEGIN 与 END
模式 | 含义 | 应用场景 |
---|---|---|
BEGIN{} | 读取文件前执行的内容 | 1)进行简单统计,计算,不涉及读取文件(常见) 2)用来处理文件之前,添加个表头(了解) 3)用来定义awk变量(很少用因为可以用-v) |
END{} | 读取文件后执行的内容 | 1)awk进行统计,一般过程: 先进行计算,最后END里面输出结果(常见) 2)awk使用数组,用来输出数组结果.(常见) |
例:
5、 awk数组
- 统计日志:类似于
- 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次
- 累加求和:统计每个ip消耗的流量
shell数组 | awk数组 | 备注 | |
---|---|---|---|
形式 | array[0]=oldboy array[1]=lidao | array[0]=oldboy array[1]=lidao | |
使用 | echo ${array[0]} ¥{array[1]} | print array[0] array[1] | |
批量输出数组内容 | fori in ${array[*]} do echo ¥i done | for(i in array ) print array[i] | awk数组专用循环变量获取到的是数组的下标,你想要数组内容 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gGWyjchY-1687827777539)(…/…/…/temp/Typora/image-20230621081308382.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-li8ducSd-1687827777539)(…/…/…/temp/Typora/image-20230627082541918.png)]
案例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4b8IiWa-1687827777541)(…/…/…/temp/Typora/image-20230621082544801.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6CPFiRO-1687827777542)(…/…/…/temp/Typora/image-20230621082850295.png)]
6、for循环
for n in 1 2 3
do
echo $n
done
shell编程for循环 | awk的for循环 | 备注 |
---|---|---|
for(i=1;i<=10;i++) do echo $i done | for(i=1;i<=10;i++) print i | awk for循环用来循环每个字段 |
例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uN2YnPa9-1687827777542)(…/…/…/temp/Typora/image-20230621083349155.png)]
7、 if判断
shell if判断 | awk if判断 | 备注 |
---|---|---|
if[“aaa” -eq 18]; then echo take to dbj fi | if(条件) print “dbj” | 常用 |
if[“aaa” -eq 18]; then echo take to dbj else echo “rest” fi | if(条件) print “dbj” else print “rest” |
例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9b2fLKzZ-1687827777543)(…/…/…/temp/Typora/image-20230621083713952.png)]
面试题:统计这段语句中,单词字符数小于6的单词,显示出来
echo I am oldboy teacher welcome to oldboy training class.
例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKiJzWuf-1687827777545)(…/…/…/temp/Typora/image-20230621084402965.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLxX03yY-1687827777545)(…/…/…/temp/Typora/image-20230621084323645.png)]
8、awk 内置变量
内置变量 | 含义 |
---|---|
NR | Number of Record 记录号行号 |
NF | Number of Field 每行有多个字段(列) $NF表示最后一列 |
FS | -F: === -v FS=: Field Separator 字段分隔符,每个字段结束标记 |
OFS | Output Field Separator 输出字段分隔符(awk显示每一列的时候,每一列之间通过什么分割,默认是空格) |
9、总结
-
gawk gnu awk
-
awk选项 -F -V
-
awk执行流程
-
awk取行与取列:指哪打哪
-
awk模式:正则,范围,特殊模式,比较
-
awk数组:统计分析日志
-
awk for if
-
man awk / info awk
-
目标:
- 计次数:
- access.log统计每个ip出现次数统计每种状态码出现次数
- secure统计系统中每个用户被攻击的次数统计攻击者ip出现次数
- 累加求和:统计每个IP消耗的流量 access.log
- 计次数:
awk
-
awk选项 -F -V
-
awk执行流程
-
awk取行与取列:指哪打哪
-
awk模式:正则,范围,特殊模式,比较
-
awk数组:统计分析日志
-
awk for if
-
man awk / info awk
-
目标:
- 计次数:
- access.log统计每个ip出现次数统计每种状态码出现次数
- secure统计系统中每个用户被攻击的次数统计攻击者ip出现次数
- 累加求和:统计每个IP消耗的流量 access.log
- 计次数: