系统操作命令

awk命令

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

awk.png

执行参数

  • -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]

  1. 如果没有条件,默认条件为匹配所有行
  2. 操作的{}内可以写逻辑代码
  3. 条件部分更像一个筛选,操作部分则执行条件部分筛选剩下的文本
  4. 条件和操作部分的整体使用''修饰,操作部分定义变量和字符串使用""修饰

条件

  • 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