awk 用法详情

一、awk介绍

  awk是文本三剑客之一,其实awk是一种语言,该语言的创始者定义为”生成报表和格式化文本输出“awk有很多种版本,这里介绍的是GUN awk(gawk)

二、awk工作原理

  第一步:执行BEGIN{action}语句块中的语句,该语句块不依赖于文件,awk在执行是,将在读取文件之前执行该语句中的语句块,常用语变量的初始化,打印输出表格的表头。
  第二步:从文件、标准输入、上一条命令输出结果输入地区一行,然后进行pattern{aciton}语句块,它将逐行扫描文件,从第一行到最后一行。若没有提供pattern语句,则默认执行打印{print},即打印每一个读取到的行。
  第三步:当读至文件最后时,执行END{action}语句块。通常用于汇总在pattern语句中执行的过程

三、awk基本用法

awk   参数       ' BEGIN{}  //  {action1;action2}   END{}  '    文件名

参数: 

-F   指定分隔符
-f    调用脚本
-v   定义变量
Begin{}    初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

//            匹配代码块,可以是字符串或正则表达式

{}            命令代码块,包含一条或多条命令,多条命令用 ;  隔开

END{}      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

例: awk  'BEGIN{X=0}/root/{X+=1}END{print "I find",X,"root lines"}'   /etc/passwd      统计 /etc/passwd 文件中包含root行的总数

选项

$0           表示整个当前行

$1           每行第一个字段

NF          字段数量变量

NR          每行的记录号,多文件记录递增

FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

\t            制表符

\n           换行符

FS          BEGIN时定义分隔符

RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~            匹配,与==相比不是精确比较

!~           不匹配,不精确比较

==         等于,必须全部相等,精确比较

!=           不等于,精确比较

&&      逻辑与

||             逻辑或

+            匹配时表示1个或1个以上

/[0-9][0-9]+/   两个或两个以上数字

/[0-9][0-9]*/    一个或一个以上数字

FILENAME 文件名

OFS      输出字段分隔符, 默认也是空格,可以改为制表符等

ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]'   定义三个分隔符

#将输出间隔符换为===将换行符换为###输出结果如下

[root@centos6 ~]#awk -F: -v OFS="===" -v ORS="####" '{print $1,$2}' /etc/passwd

awk用法详解

print 打印

  • print 是 awk打印指定内容的主要命令,也可以用 printf
  • awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd        打印全文
  •  awk '{print ""}' /etc/passwd      不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
  • awk '{print "a"}' /etc/passwd      输出相同个数的a行,一行只有一个a字母
  • awk -F:  '{print $1}'  /etc/passwd  ==   awk  -F  ":"  '{print $1}'  /etc/passwd
  • awk -F: '{print $1 $2}'                 输入字段1,2,中间不分隔
  • awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd          输出字段1,3,6, 以制表符作为分隔符
  • awk -F: '{print $1; print $2}'   /etc/passwd                   输入字段1,2,分行输出
  • awk -F: '{print $1 "**" $2}' /etc/passwd                        输入字段1,2,中间以**分隔
  • awk -F: '{print "name:"$1"\tid:"$3}' /etc/passwd          自定义格式输出字段1,2
  • awk -F: '{print NF}' /etc/passwd                                  显示每行有多少字段
  • awk -F: 'NF>2{print }' /etc/passwd                              将每行字段数大于2的打印出来
  • awk -F: 'NR==5{print}' /etc/passwd                             打印出/etc/passwd文件中的第5行
  • awk 'END{print NR}' /etc/passwd                                统计文本行数
  • awk -F: 'NR==5,NR==6{print}' /etc/passwd              打印出/etc/passwd文件中的第5行和第6行
  • awk -F: 'NR!=1{print}'  /etc/passwd                          不显示第一行
  • awk -F: '{print $1,$2 > "1.txt"}'  /etc/passwd             输出到文件中
  • awk -F: '{print}' /etc/passwd > 2.txt                           使用重定向输出到文件中

字符匹配

  • awk  -F: '/root/{print }'  /etc/passwd                         打印出文件中含有root的行
  • awk  -F: '/'$A'/{print }'  /etc/passwd                         打印出文件中含有变量 $A的行
  • awk -F: '!/root/{print}' /etc/passwd                           打印出文件中不含有root的行
  • awk -F:  '/root|tom/{print}'  /etc/passwd                    打印出文件中含有root或者tom的行
  • awk -F: '/mail/,mysql/{print}'  test                            打印出文件中含有 mail*mysql 的行,*代表有0个或任意多个字符
  • awk -F: '/^[2][7][7]*/{print}'  test                              打印出文件中以27开头的行,如27,277,27gff 等等
  • awk -F: '$1~/root/{print}' /etc/passwd                     打印出文件中第一个字段是root的行
  • awk -F: '($1=="root"){print}' /etc/passwd               打印出文件中第一个字段是root的行,与上面的等效
  • awk -F: '$1!~/root/{print}' /etc/passwd                   打印出文件中第一个字段不是root的行
  • awk -F: '($1!="root"){print}' /etc/passwd                打印出文件中第一个字段不是root的行,与上面的等效
  • awk -F: '$1~/root|ftp/{print}' /etc/passwd               打印出文件中第一个字段是root或ftp的行
  • awk -F: '($1=="root"||$1=="ftp"){print}' /etc/passwd   打印出文件中第一个字段是root或ftp的行,与上面的等效
  • awk -F: '$1!~/root|ftp/{print}' /etc/passwd              打印出文件中第一个字段不是root或不是ftp的行
  • awk -F: '($1!="root"||$1!="ftp"){print}' /etc/passwd    打印出文件中第一个字段不是root或不是ftp的行,与上面等效
  • awk -F: '{if($1~/mail/) {print $1} else {print $2}}'  /etc/passwd   如果第一个字段是mail,则打印第一个字段,否则打印第2个字段

https://www.cnblogs.com/liubi/p/8998994.html

https://blog.csdn.net/weixin_41477980/article/details/89511954

猜你喜欢

转载自blog.csdn.net/iris_csdn/article/details/119214291