系统操作命令
awk
命令
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
执行参数
- -F : 修改字段分隔符,支持正则表达式
awk -F "正则表达式"
(默认是空格)
awk
内置变量
- [A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
- $n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段*
- $0 : 这个变量包含执行过程中当前行的文本内容*
- NF : 表示字段数,在执行过程中对应于当前的字段数[A]*
- NR : 表示记录数,在执行过程中对应于当前的行号[A]*
- FS : 字段分隔符(默认是任何空格)[A]*
- OFMT : 数字的输出格式(默认值是%.6g)[A]
- OFS : 输出字段分隔符(默认值是一个空格)[A]
- ORS : 输出记录分隔符(默认值是一个换行符)[A]
- RS : 记录分隔符(默认是一个换行符)[A]
- FILENAME : 当前输入文件的名[A]
- ARGV : 包含命令行参数的数组[N]
- ARGC : 命令行参数的数目[N]
- ERRNO : 最后一个系统错误的描述[N]
- RSTART : 由match函数所匹配的字符串的第一个位置[N]
- RLENGTH : 由match函数所匹配的字符串的长度[N]
- SUBSEP : 数组下标分隔符(默认值是34)[N]
- ENVIRON : 环境变量关联数组[P]
- FNR : 同NR,但相对于当前文件[P]
- ARGIND : 命令行中当前文件的位置(从0开始算)[G]
- CONVFMT : 数字转换格式(默认值为%.6g)[G]
- FIELDWIDTHS : 字段宽度列表(用空格键分隔)[G]
- IGNORECASE : 如果为真,则进行忽略大小写的匹配[G]
- 如果没有条件,默认条件为匹配所有行
- 操作的
{}
内可以写逻辑代码 - 条件部分更像一个筛选,操作部分则执行条件部分筛选剩下的文本
- 条件和操作部分的整体使用
''
修饰,操作部分定义变量和字符串使用""
修饰
条件
- NR==2 : 匹配第二行
- NR>=2, : 匹配第二行以后的行
- NR>2 : 第三行以后的行
- NR==2,NR==5 : 第二行到第五行
- NR==2;NR==5 : 第二行和第五行
- /{}/ : 正则匹配行,
{}
内为匹配内容 - !/{}/ : 正则不匹配行,
{}
内为匹配内容(反向匹配) - /{}/,/{}/ : 正则匹配左侧表达式的行到右侧表达式的行,左侧表达式匹配不到不匹配全部行,右侧表达式匹配不到则匹配剩余全部行,
{}
内为匹配内容 - $1~/{}/ : 第一列正则匹配行,
{}
内为匹配内容 - $1!~/{}/ : 第一列正则不匹配行,
{}
内为匹配内容(反向匹配) - $1>1000 : 第一列大于
1000
的行 - $1=="root" : 第一列为
root
的行
操作
- BEGIN{} : BEGIN语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中,该语句块左侧不能有模式语句如果有需要使用
;
隔开 - {} : pattern语句块 中的通用命令是最重要的部分,它也是可选的如果没有提供pattern语句块,则默认执行
{ print }
,即打印每一个读取到的行,awk读取的每一行都会执行该语句块 - END{} : END语句块 在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块,该语句块左侧不能有模式语句如果有需要使用
;
隔开
- 测试文本
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
查询信息
- awk 'NR==2{print $0}' awk_test.txt : 输出第二行的所有内容(
{print $0}
可以省略) - awk 'NR>2{print $0}' awk_test.txt : 输出第三行以后的所有内容
- awk 'NR>=2{print $0}' awk_test.txt : 输出第二行以后的所有内容
- awk 'NR==2,NR==5' awk_test.txt : 输出第二行到第五行的所有内容
- awk 'NR==2;NR==5' awk_test.txt : 输出第二行和第五行的所有内容
- awk 'NR==2{print $1};NR==5' awk_test.txt : 输出第二行第一列和第五行的所有内容
- awk '$2~/Xiaoyu/' awk_test.txt : 输出第二列匹配
Xiaoyu
行的所有内容 - awk '{print $NF}' awk_test.txt : 输出所有行的最后一列内容
$NF
表示最后一列NF
表示列数 - awk -F "[ :]+" '{print $4}' awk_test.txt : 以
[ :]+
正则匹配的内容为分隔符,输出第五列内容 - awk '/Xiaoyu/;BEGIN{FS="[: ]+"}{print $4}' awk_test.txt : 先将
FS
设为[: ]+
,输出匹配Xiaoyu
行的所有内容,再输出第四列内容,效果等同于awk '/Xiaoyu/{print $0};BEGIN{FS="[: ]+"}{print $4}' awk_test.txt
(FS
为内容分隔符)
[root@1997sty ~]# awk 'NR==2{print $0}' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@1997sty ~]# awk 'NR>2{print $0}' awk_test.txt
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@1997sty ~]# awk 'NR>=2{print $0}' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@1997sty ~]# awk 'NR==2,NR==5' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
[root@1997sty ~]# awk 'NR==2;NR==5' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
Liu Bingbing 41117483 :250:100:175
[root@1997sty ~]# awk 'NR==2{print $1};NR==5' awk_test.txt
Zhang
Liu Bingbing 41117483 :250:100:175
awk '$2~/Xiaoyu/' awk_test.txt
[root@1997sty ~]# awk '$2~/Xiaoyu/' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@1997sty ~]# awk '{print $NF}' awk_test.txt
:250:100:175
:155:90:201
:250:60:50
:250:80:75
:250:100:175
:50:95:135
:250:168:200
:175:75:300
:250:100:175
[root@1997sty ~]# awk -F "[ :]+" '{print $4}' awk_test.txt
250
155
250
250
250
50
250
175
250
[root@1997sty ~]# awk '/Xiaoyu/;BEGIN{FS="[: ]+"}{print $4}' awk_test.txt
250
Zhang Xiaoyu 390320151 :155:90:201
155
250
250
250
50
250
175
250
排除信息
- awk '$2!~/Xiaoyu/' awk_test.txt : 输出第二列不匹配
Xiaoyu
行的所有内容(反向匹配)
[root@1997sty ~]# awk '$2!~/Xiaoyu/' awk_test.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
统计信息
- awk '{i++}END{print i}' awk_test.txt : 每读取一行
i
自增,结束后输出结果(统计行数)
[root@1997sty ~]# awk '{i++}END{print i}' awk_test.txt
9
替换信息
- awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt : 第二列匹配
Xiaoyu
行,正则匹配:
并替换为$
,范围是$NF
列,输出$NF
列(gsub第三个参数不填,默认为$0
)
[root@1997sty ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
$155$90$201
最后一次更新于2019-11-26 20:20
0 条评论