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

2022-07-13  本文已影响0人  分布式与微服务

awk

awk内置变量

变量 解释 说明
记录Record 通过回车判定行
字段Field 默认通过空格分割
参数 解释
- F 指定分割字符串
-v 定义或修改awk内置变量 ; 内置变量如下
-f 读取文件内awk命令
变量 功能
NR 记录的行号; Number Of Row ==NR
FNR awk [参数] [动作] 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表示取出整行数据
 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}'
复制代码

统计

模式 含义 应用场景
BEGIN{} 里面的内容会在awk读取文件前执行 1.进行简单统计计算不涉及读取文件 2.用来处理文件之前写个表头
END{} 里面的内容会在awk读取文件后执行 1.awk进行统计,一般统计:先计算,最后END输出结果 2.awk使用数组,用来输出结果
功能 shell awk
数组 array[0]=tom array[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 fi if($NF>18) print "good" else print "bad"
 cat demo.txt | awk '{for(i=1;i<=NF;i++) if($i=="123") a++} END{print a}'
上一篇 下一篇

猜你喜欢

热点阅读