IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux文本处理三剑客之awk -> 正文阅读

[系统运维]linux文本处理三剑客之awk

4.1特点与应用场景

awk

一门语言,类似于C语言
过滤,统计,计算
过滤,统计日志

4.2 awk内置变量

内置变量

示例

NR

Number or Record?记录号,行号

NF

Number of Field?每行有多个字段(列) $NF表示最后一列

awk '{print $NF}'? 文件名

FS

-F:? ? ===-v FS=:? Field Separator?字段分隔符,每个字段结束标记

OFS

Output Field Separator 输出字段分隔符,(awk显示每一列的时候,每一列之间通过什么分割,默认是空格)

awk -F: -v OFS=: '{print $NF,$2,$3,$4,$5,$6,$1}'?文件名

4.3行与列

名词

awk中叫法

一些说明

记录record

每一行默认通过回车分割

字段域field

每一列默认通过空格分割

awk中行和列结束标记都是可以修改的

? ?

1)取行

awk

示例

NR==1

取出某一行

awk 'NR==1' access.log.20220304000301

NR>1&&NR<=5

取出1到5行范围

/oldboy/

/101/,/105/

符号

> < >= <= == !=

2)取列

-F?指定分隔符?指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字?取出某一列,注意:在awk中$内容一个意思?表示取出某一列
$0整行的内容,
{print?xxx}
$NF表示最后一列(示例)
awk?'{print?$NF}'?access.log.20220304000301

取网卡地址

只取个ip地址

3)小结

行与列名称
awk取行与列,指哪打哪
取出网卡ip地址

4.4 swk?模式匹配

谁可以作为awk的条件

awk

-F"{/}+"

'NR==3{print $3}'

命令

选项

'条件{动作}'

'模式{干啥}'

'模式{动作}'

'pattern{action}'

1)比较表达式-参考上面取行部分

2)正则:

支持扩展正则
awk可以精确到某一列,某一行中包含/不包含.....内容。
~包含
!~不包含

正则

awk正则

^表示以....开头的行

某一列的开头? $3~/^oldoy/

$表示以.....结尾的行

某一列的结尾$4~/lidao$/

^$表示空行

某一列是空的? ? 很少用

? ?

#找出? 第3列以2开头的行,并显示第1,3和最后一列

找出? 第3列以1或2开头的行,并显示第1列,第3列和最后一列

还有这几种写法

3)表示范围

/哪里开始/,/哪里结束/?常用
NR==1,NR==5??从第1行开始到第5行结束???类似于sed?-n?'1,5p'


#显示指定时间(11:02:00到11:02:30)范围内容的ip地址和用户访问uri?column?-t(自动对齐)
awk?'/11:02:00/,/11:02:30/{print?$1}'?access.log.20220304000301
awk?'/11:02:00/,/11:02:30/{print?$1,$7,$9,$10}'?access.log.20220304000301?|column?-t

4)特殊模式BEGIN{}和END{}

模式

含义

应用场景

BEGIN{}

里面的内容会在awk读取文件之前执行

1)进行简单统计,计算,不涉及读取文件(常见)

2)用来处理文件之前,添加个表头(了解)

3)用来定义awk变量(很少用,因为可以用-v)

END{}

里面的内容会在awk读取文件之后执行

1)awk进行统计,一般过程;先进行计算,最后END里面输出结果(常见)

2)awk使用数组,用来输出数组结果。(常见)

  1. END{}统计计算:

  2. 统计方法

统计方法

简写形式

应用场景

i=i+1

i++

计数,统计次数

sum=sum+???

sum+=???

求和,累加

注意:i,sum都是变量

#统计/etc/services??里面有多少个空行
awk?'/^$/'?/etc/services

统计有多少空行

awk?'/^$/{i++}END{print?i}'?/etc/services

#seq?100?求和1+2+3.。。+100?awk实现
seq?100?|awk?'{sum=sum+$1}END{print?sum}'

求和显示过程

seq 100 |awk '{sum=sum+$1;print sum}END{print sum}'

4.5 awk数组

  1. 统计日志:类似于

  2. 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次数

  3. 累加求和:统计每个ip消耗的流量。

shell数组

awk数组

形式

array[0]=oldboy array[1]=liao

array[0]=oldboy array[1]=liao

使用

echo ${array[0]} ${array[1]}

print array[0] array[1]

批量输出数组内容

for i in ${array[*]}

do

? ? echo $i

done

for(i in array)

? ? ? print array[i]

awk数组专用循环,变量获取到的是数组的下标

? ?

#awk中字母??会被识别为变量,如果只是想使用字符串需要使用双引号引起来??
awk?'BEGIN{a[0]=oldboy;a[1]=liao;?print?a[0],a[1]}'

所以无结果

数字和加双引号可以正常显示

awk数组专用循环打印

[root@heimajinpai?~]#?awk?'BEGIN{a[0]=12306;a[1]="liao";?for(i?in?a)?print?i?}'
0
1
[root@heimajinpai?~]#?awk?'BEGIN{a[0]=12306;a[1]="liao";?for(i?in?a)?print?a[i]?}'
12306
liao
[root@heimajinpai?~]#?awk?'BEGIN{a[0]=12306;a[1]="liao";?for(i?in?a)?print?i,a[i]?}'
0?12306
1?liao

案例:

http://www.etantian.org/index.html
http://www.etantian.org/1.html
http://post.etantian.org/2.html
http://mp3.etantian.org/3.html
http://www.etantian.org/4.html
http://post.etantian.org/5.html
[root@heimajinpai?test]#?awk?-F"[/]+"?'{print?$2}'?url.txt
www.etantian.org
www.etantian.org
post.etantian.org
mp3.etantian.org
www.etantian.org
post.etantian.org
[root@heimajinpai?test]#?awk?-F"[/.]+"?'{print?$2}'?url.txt
www
www
post
mp3
www
post
[root@heimajinpai?test]#?awk?-F"[/.]+"?'{array[$2]++}END{for(i?in?array)print?i,array[i]}'?url.txt
www?3(出现的次数)
mp3?1(出现的次数)
post?2(出现的次数)

#array[]++????你要统计什么?[]?里面就是什么(某一列)
awk?-F"[/.]+"?'{array[$2]++}END{for(i?in?array)print?i,array[i]}'?url.txt

#统计access.log中????每种状态码出现的次数(方式一)
awk??'{array[$10]++}END{for(i?in?array)print?i,array[i]}'?access.log.20220304000301?|sort?-rnk2

#统计access.log中????每种状态码出现的次数(方式一)
awk?'$10~/[0-9][0-9][0-9]/{array[$10]++}END{for(i?in?array)print?i,array[i]}'?access.log.20220304000301?|sort?-rnk2

注意:使用awk统计日志,尽量精确匹配。


4.6 for循环

for?n?in?1?2?3
do
????echo?$n
done

for(i=1;i<10;i++)

do

? ? ?echo $i

done

for(i=1;i<10;i++)

print i

awk for循环用来循环每个字段

#1+100
[root@heimajinpai?nginxlog]#?awk?'BEGIN{for(i=1;i<=100;i++)sum+=i;print?sum}'
5050
[root@heimajinpai?nginxlog]#

4.7if 判断

统计磁盘空间使用率,如果大于70%,则提示磁盘空间不足,并显示磁盘分区,磁盘使用率,磁盘挂载点

df?-h?|awk?-F"[?%]+"?'NR>1{if($5>=70)print?"disk?not?enough"}'

df?-h?|awk?-F"[?%]+"?'NR>1{if($5>=1)print?"disk?not?enough",$1,$5,$NF}'

注意:awk使用多个条件的时候? 第1个条件可以放在 ‘条件{动作}’ 第2个条件? 一般使用if

面试题:统计这段语句中,单词中字符小于6的单词,显示出来。

4.9总结

个人网站:黑马金牌编程 - 技术博客,分享技术、分享生活

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:46:32  更:2022-04-15 00:51:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:50:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码