linux三剑客awk教你如何裁剪结果集

·  阅读 5457
linux三剑客awk教你如何裁剪结果集

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

awk

  • awk在Linux中我们称之为输出。在Linux的终端上所有的东西我们都可以用awk来输出赋值。

image-20220601190434331.png

  • 首先我们要知道终端的所有内容都可以简化为上图的二维结构。awk既然是输出那就需要一个坐标及跨度才能确定输出的内容
  • 输出其实包含两个一次,一个是获取一个是返回。我们往往关注的重点是返回的结果集。但是两者是缺一不可

awk内置变量

  • 在了解变量之前我们得先了解下awk的基本单元。
变量解释说明
记录Record通过回车判定行
字段Field默认通过空格分割
参数解释
- F指定分割字符串
-v定义或修改awk内置变量 ; 内置变量如下
-f读取文件内awk命令
  • 好了有了这两个关键名词之后我们再来看awk为我们内置的对象就简单很多了。
变量功能
NR记录的行号; Number Of Row ==NR
FNRawk [参数] [动作] file1 file2 ;此时动作中使用FNR显示行号会显示各个文件的行号,如果NR则会两个文件汇总后显示行号
NF记录的列号: Number of Field == NF
FS列分割符 : File Separator = FS
OFS输出字段分割符: OUT FILE SEPERATOR = OFS
RS行分隔符;即是换行符;比如我们行空格匹配换行。awk -v RS=" " '{print $1}' demo.txt
ORS指定输出换行符
FILENAME当前文件名
ARGC命令行参数个数
ARGV数组: 保存的是命令行锁指定的各参数名

获取数据

awk
NR==1取出第一行
NR>=1&&NR<=5取出一到五行范围
/tom/显示tom匹配的行
/tom/,/jack/匹配现实从lcf 到jack之间的内容
符号> < >= <= == !=
-F每一列结束标记
{print $num}获取某列值 , num=0表示取出整行数据

image-20220602094325052.png

  • 上面是获取某个结果集的指定几列并且按照自己的规格输出。
 username  password fav age
 zhangsan 123 ball 13
 lisi 123 swim 15
 wangwu 1w3 eat 82
  • 针对上面的文本我们来实现上述的几个操作

查询fav列包含2的数据

 cat demo.txt | awk -F "[ ]+" '$2~/.*2.*/'

查询fav列包含2的指定列数据

 cat demo.txt | awk -F "[ ]+" '$2~/.*2.*/{print $1,$2,$NF}'

查询zhangsan到lisi之间数据的最后一列

 cat demo.txt | awk -F "[ ]+" '/zhangsan/ , /lisi/{print $NF}'

查询2,3行数据

 awk 'NR==2{print $0}NR==3{print $0}' demo.txt

获取最后一行数据

 cat demo.txt | awk 'END{print $0}'

统计

  • awk 我们上面二维的方式输出内容。但是有时候我们想统计文本内容。比如统计关键词出现的次数啦。计算文本内容啦等等需求。这个时候awk为我们提供了两个特别的模式。BEGIN。END
模式含义应用场景
BEGIN{}里面的内容会在awk读取文件前执行1.进行简单统计计算不涉及读取文件 2.用来处理文件之前写个表头
END{}里面的内容会在awk读取文件后执行1.awk进行统计,一般统计:先计算,最后END输出结果 2.awk使用数组,用来输出结果
功能shellawk
数组array[0]=tomarray[0]=tom
打印数组echo $array[0]printf array[0]
循环for i in ${array[*]} do echo $i done (shell中循环获取的是数组中元素)for(i in array) print array[i] (awk中获取的是元素下标)
判断if [ "tom" -eq 18 ];then echo good fiif($NF>18) print "good" else print "bad"
  • if往往会单独使用。for往往是结合BEGIN。END使用的。假如现在我们要统计下上述文本123出现的概率
 cat demo.txt | awk '{for(i=1;i<=NF;i++) if($i=="123") a++} END{print a}'

下期介绍sed

分类:
后端
分类:
后端
收藏成功!
已添加到「」, 点击更改