awk命令

AWK命令
在这里插入图片描述
可以通过awk –version查看awk的版本
文本三剑客的作用
awk:抓取,处理数据
sed:一行一行找数据 替换,修改
grep:过滤
awk命令相关
awk写法格式
awk 参数 “[参数项]” ‘模式{动作}’ 文件名
awk模式项与动作项
模式是条件,根据什么条件来筛选数据。
动作是干啥,对删选出来的数据进行什么操作。
没加{}的是模式,{}里的是动作
如果只有模式,是输出符合模式的整行
如果只有动作,是对整个文件的所有行执行此动作
模式项:正则表达式、比较表达式、范围模式、特殊模式BEGIN和END
了解awk的BEGIN和END模块
awk 参数 “[参数项]” ‘BEGIN{}模式{动作}END{}’ 文件名
在模式项前面有BEGIN模块,在动作项后面有END模块
BEGIN模块告诉awk如何读数据。END模块告诉awk程序要如何结束。
awk命令执行过程:
首先是读取文件第一行,然后查看命令的模式(条件)项,如果符合条件则执行命令的动作项进行操作。如果不符合,则读取下一行,再重复上面的操作。直到读取到文件的结尾。
awk参数
-F参数指定分隔符
指定awk按照参数后面””里的参数项写的符号进行文件内容的切割,不再按照空格来区分。如果不加-F参数,awk默认按照空格进行文本的分隔。比如按照空格来分隔,碰到多个空格在一起的情况,会当做一个空格,也就是一个分隔符来处理
并且参数项可以运用正则,[]里可以指定多个符号,[]+会把[]里的所有符号碰到连在一起的都只作为一个分隔符,就是所谓的贪婪模式
输出
{}动作项里写 {print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲ print代表输出的意思。代表取列,$1就是输出第一部分,以此类推。 0 代 表 输 出 全 部 内 容 。 0代表输出全部内容。 0NF默认取每行的最后一部分,不管每行的数量是否相等。
在这里插入图片描述
多个模式和动作,是’模式{动作}再模式{在动作}’
在这里插入图片描述
NR和NF
NR表示行号
NF表示竖列号,竖列的数量
如果想要过滤一行字符串里有多少个相同的字符,可用-F指定分隔,再用列数减去1
在这里插入图片描述
NR和\n换行符的关系
NR这个符号真正的含义不是行号,而是数据被awk读取一段以后,NR会记录一次(自身+1的方式)。由于awk默认以\n作为每次读数据的结束标志,因此NR就恰好等于行号。
假如修改awk默认的读数据时候的默认换行符,也就是读入换行符(读取数据时以什么符号作为一行)。默认awk读入换行符和输出换行符都是\n
可以通过修改BEGIN模块,在awk读取数据之前设定它以什么作为读入换行符和输出换行符。
修改BEGIN和END模块,在取出来的内容开头和结尾添加内容
也可以对模块运行计算,变量的计算,赋值,变量的赋值
但是如果赋值是字母的话,必须要加双引号
在这里插入图片描述
通过awk ’BEGIN{RS=””}’修改读入换行符
通过awk ’BEGIN{RS=””}’修改读入换行符(RS学名:输入记录分隔符)
通过awk ’BEGIN{ORS=””}’修改输出换行符
通过awk ’BEGIN{ORS=””}’修改输出换行符(ORS学名:输出记录分隔符)
例如:修改读入换行符为:
在这里插入图片描述
在这里插入图片描述
修改读入换行符为: 输出换行符为*
把原本的\n作为换行符修改为了用:来作为换行符
把以:为换行符,把换行符替换为单纯的* 并还以\n作为换行符
如果只有输出换行符,是把原本的\n替换成单纯的字符
在这里插入图片描述
~在awk命令里是启用正则表达式
用于表达与相反的意思
针对某一列的独特过滤需要启用正则表达式
如下:显示第九项以200为开头和结尾的整行内容(200为访问成功)
在这里插入图片描述
如下:显示第九项以404位开头和结尾的第一部分,去重并计数
在这里插入图片描述
效果同上,精确查找,第九项为404的行(404为访问失败,报错)
在这里插入图片描述
过滤到符合条件的,计数并输出的方式
x=x+1是自身加1的赋值,默认起始为0
awk ‘/过滤条件/’{x=x+1;print x}’ 文件名
是过滤此文件符合过滤条件的行 计数并输出,输出结果为一个过程
awk ‘/过滤条件/’{x=x+1}END{print x}’ 文件名
是过滤此文件符合条件的行 只计算计数,通过END模块输出,输出结果为相加之后的数量

如果求一个文件的行数,用awk上面的方法,只需去掉过滤条件即可,因为awk一行一行读数据,读一行,赋值自身加1,最后输出赋值变量结果即可
在这里插入图片描述
如果是需要对文件里面的值进行运算,需要用$取需要运算的列(如果只有一列直接 0 取 全 部 , 如 果 有 多 列 , 需 要 用 0取全部,如果有多列,需要用 0后加数字,来限定需要计算的列),再进行自身相加的赋值
在这里插入图片描述
数组
如果想用一种变量来表示多组数据,通常我们优先考虑数组的形式。就好比是拉大家进一个群,这个群就是数组。
例如:变量名[数字]=不同的值
如果我们只知道变量名,那么我们只能找到变量名和所有的数字。要想找到指定的值,必须知道变量名和对应的数字。
在这里插入图片描述
for(M in ya)是把ya的值赋值给M,M会有ya的所有的值,一共被赋值了3次,也就是左边的数字,print M是取出M的赋值,就是数字,print ya[M]是有数组又有数组的值,就会输出数组里对应值的内容,就是右边的字母
在这里插入图片描述
如果需要进行变量的运算,如下:y是从x里取值,取的是数组里所有的值,x[y]中x是数组,y是数组里的值,有数组又有数组里的值,则会输出对应的内容,也就是前面$1+$2运算后的变量
在这里插入图片描述
通过awk命令去重并计数

在这里插入图片描述

课后练习
企业面试题1:把相同字母对应的数字相加
4.假如现在有个文本,格式如下:
a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6
d 9
即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:
a 4
b 8
c 2
d 16
f 6
g 2
即将相同的字母后面的数字加在一起,按字母的顺序输出。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值