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}'
下期介绍sed