awk命令

分隔符

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 内置变量

内置变量含义
NRNumber of Record 记录号行号
NFNumber of Field 每行有多个字段(列) $NF表示最后一列
FS-F: === -v FS=: Field Separator 字段分隔符,每个字段结束标记
OFSOutput 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值