awk命令的基本使用
一、awk命令概述
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,具备强大的文本格式化能力,比如对一堆看起来没有什么规律的日志文件,文本文件等,通过awk命令之后,格式化输出为专业的可以做为应用级数据分析的样式,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
知识补充
grep,擅长单纯的查找或匹配文本内容;
sed,擅长文本编辑,处理匹配到的文本内容;
awk,适合格式化文本文件,对文本文件进行更复杂的加工处理、分析;
awk工作原理:
与sed一样,逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。sed作用于一整行的处理,而awk将一行分成数个字段来处理。当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出;如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。
sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个"“字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符” &&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。
awk完整语法
1 | awk 'BEGIN {commands} pattern {commands}END{commands}' file1 |
BEGIN:处理数据前执行的命令;
END:处理数据后执行的命令;
pattern:模式,每一行都执行的命令;
BEGIN和END里的命令只是执行一次;
pattern里的命令会匹配每一行去处理;
二、内建变量介绍
awk 包含几个特殊的内建变量(可直接用)如下所示:
变量 | 说明 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位。 |
NF | 当前处理的行的字段个数。 |
NR | 当前处理的行的行号(序数)。 |
$0 | 当前处理的行的整行内容。 |
$n | 当前处理行的第 n 个字段(第 n 列)。 |
FILENAME | 被处理的文件名。 |
三、简单用法示例
1 | [root@nanxi ~]# head -5 /etc/passwd > 3.txt |
1、取行
1 | awk取行: awk '内容' file |
1 | [root@nanxi ~]# awk 'NR==3' 3.txt ### 打印第三行内容 |
1 | [root@nanxi ~]# awk '/root/' 3.txt ###打印包含root的行 |
1 | [root@nanxi ~]# awk -F: '$3==3||$5=="bin"' 3.txt ###打印第3段为3或者第5字段是bin的行 -F: 指定字段分隔符为: |
1 | [root@nanxi ~]# awk -F : '$5 ~ /^l/' 3.txt ###输出第五字段是以l开头的行 |
2、取列
1 | awk取行: awk '{print 列号}' file |
1 | [root@nanxi ~]# awk -F "[:/]+" '{print $7}' 3.txt |
1 | [root@nanxi ~]# awk -F: '{print $1,$7}' 3.txt ###以:为分隔符取出第1列和第7列 |
3、运算
1 | [root@nanxi ~]# awk -F: 'BEGIN{print "hahhahahhahaha"}' 3.txt |
执行BEGIN{commands}语句块中的语句从文件或stdin中读取第一行,看有无模式匹配,若无则执行{}中的语句若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句若不匹配则不执行{}中的语句,接着读取下一行重复这个过程,知道所有行被读取完毕执行END{commands语句块中的语句}
BEGIN 和 END 部分只是执行一次中间部分每一行都执行一次
1 | [root@nanxi ~]# awk 'BEGIN{print 4+(6-3)*8}' |
1 | [root@nanxi ~]# echo {1..5} |
1 | ###使用bc命令进行计算(与awk无关) |
使用awk批量创建用户
1 | [root@nanxi ~]# echo {1..3}|xargs -n1|awk '{print "useradd nanxi_test"$1}'|bash |
1 | [root@nanxi ~]# echo {1..3}|xargs -n1|awk '{print "userdel nanxi_test"$1}'|bash |
awk批量创建用户比sed后向引用更加便捷,作为三剑客的老大当之无愧😄
一个人使劲踮起脚尖靠近太阳的时候,全世界都挡不住她的阳光。
——《人民日报》