awk
- awk在Linux中我们称之为输出。在Linux的终端上所有的东西我们都可以用awk来输出赋值。
- 首先我们要知道终端的所有内容都可以简化为上图的二维结构。awk既然是输出那就需要一个坐标及跨度才能确定输出的内容
- 输出其实包含两个一次,一个是获取一个是返回。我们往往关注的重点是返回的结果集。但是两者是缺一不可
awk内置变量
变量 |
解释 |
说明 |
行 |
记录Record |
通过回车判定行 |
列 |
字段Field |
默认通过空格分割 |
参数 |
解释 |
- F |
指定分割字符串 |
-v |
定义或修改awk内置变量 ; 内置变量如下 |
-f |
读取文件内awk命令 |
- 好了有了这两个关键名词之后我们再来看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}'
复制代码
统计
- awk 我们上面二维的方式输出内容。但是有时候我们想统计文本内容。比如统计关键词出现的次数啦。计算文本内容啦等等需求。这个时候awk为我们提供了两个特别的模式。BEGIN。END
模式 |
含义 |
应用场景 |
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" |
- if往往会单独使用。for往往是结合BEGIN。END使用的。假如现在我们要统计下上述文本123出现的概率
cat demo.txt | awk '{for(i=1;i<=NF;i++) if($i=="123") a++} END{print a}'
网友评论