美文网首页
[linux] awk

[linux] awk

作者: VanJordan | 来源:发表于2019-04-18 14:18 被阅读0次

Overview

  • awk是一个强大的文本处理工具,尽管操作可能会很复杂,但命令的语法始终是:
    awk '{pattern + action}'或者awk 'pattern {action}',其中pattern表示的是AWK在数据中查找的内容,action是在找到匹配内容时所执行的一系列命令。
  • awk程序由一个主输入循环维持。并且反复执行,直到终止条件被触发。但是这些处理都是由awk自己完成的。我们只需要编写循环中的处理。
  • awk中还定义了两个特殊的字段。BEGINENDBEGIN用于在主输入循环之前执行。即在未读取输入文件之前执行。END则相反,用于在主输入循环之后执行。即在读取输入文件执行完毕后执行。
  • awk主要的调用方法:awk [-F 域分隔符] 'awk程序段' 输入文件,我们可以通过-F来指定域分割符,在awk中认为输入文件是结构化的,awk将每个输入文件行定义为记录。行中的每个字符串定义为域,域之间用空格,tab键或其他字符进行分割,分割的符号叫做分隔符。多个连续的空格或tab键被当作一个分隔符来处理。
  • awk中定义了一个域操作符$来指定执行动作的域。域操作符后面跟数字或变量来标识域的位置。域的编号从1开始,0表示所有的域。
>>> zhangsan   男   24    江西  138xxxxxxxx
上面这条记录中,$0就代表了整条记录,$1就代表[zhangsan],$2就代表[男]

使用方法

  • 可以通过在BEGIN中指定FS来指定分隔符,一个最为常用的命令是awk -F"\t" '{print $2}' txcut $2 txt.txt类似。
[fuwh@localhost 12:42 ~/stu]$ cat tx
fuwh men:jiangxi
zhangsan girl:shanghai
[fuwh@localhost 12:45 ~/stu]$ awk '{print $2}' tx
men:jiangxi
girl:shanghai
[fuwh@localhost 12:46 ~/stu]$ awk -F":" '{print $2}' tx
jiangxi
shanghai
[fuwh@localhost 12:47 ~/stu]$ awk 'BEGIN {FS=":"} {print $1}' tx
fuwh men
zhangsan girl
  • awk中可以使用多种关系运算符号,除过最常用的布尔表达式和大于小于等于之外,还有两个~表示匹配正则表达式,!~表示不匹配正则表达式。
[fuwh@localhost 13:31 ~/stu]$ cat tx
fuwh:men:jiangxi
zhangsan:girl:shanghai
lisi:girl:beijing
wangwu:feman:shenzhen
[fuwh@localhost 13:31 ~/stu]$ awk 'BEGIN{FS=":"} {if($2=="men"||$2~/girl/) print $3}' tx
jiangxi
shanghai
beijing
  • awk中也可以定义变量,以及使用各种运算符,运算符号除过比较常用的加减乘除取模还有两个是比较有用的一个就是++x,x++自增自减,以及^或**乘方。
[fuwh@localhost 14:06 ~/stu]$ cat tx
fuwh:men:jiangxi
zhangsan:girl:shanghai
lisi:girl:beijing
wangwu:feman:shenzhen
[fuwh@localhost 14:10 ~/stu]$ awk 'BEGIN{FS=":"} {if($2=="girl") x++} END{print "女生个数:" x}' tx
女生个数:2
  • awk中还内建了许多环境变量,设置环境信息,$n表示当前记录的第n个域,域间由FS分割,$0表示记录所有的域。NR表示当前记录数,OFS:输出域分隔符,默认是空格键,ORS:输出记录分隔符,默认是换行符,FIELDWIDTHS:字段宽度列表,以空格键分割,FILENAME:当前文件名
[fuwh@localhost 14:31 ~/stu]$ cat tx
fuwh:men:jiangxi
zhangsan:girl:shanghai
lisi:girl:beijing
wangwu:feman:shenzhen
[fuwh@localhost 14:31 ~/stu]$ awk 'BEGIN{FS=":"} {print "第"NR"条记录"} END{print FILENAME "共"FNR"条记录,每条有"NR"个域"}' tx
第1条记录
第2条记录
第3条记录
第4条记录
tx共4条记录,每条有4个域
  • awk中除过print这个函数,还提供了printf这个函数进行结构化的输出,基本语法是printf (格式控制符,参数),格式控制符是和python%d,%f等等是一样的,修饰符估计也用不上,可以用于控制域的宽度,以及小数点的位数等等。
[fuwh@localhost 14:35 ~/stu]$ cat tx
fuwh:men:jiangxi
zhangsan:girl:shanghai
lisi:girl:beijing
wangwu:feman:shenzhen
[fuwh@localhost 14:46 ~/stu]$ awk 'BEGIN{FS=":"}{printf("%s\t%s人\n",$1,$3) }' tx
fuwh    jiangxi人
zhangsan        shanghai人
lisi    beijing人
wangwu  shenzhen人
  • 内置字符串函数,awk中提供了强大的内置字符串函数,用于实现文本的字符串替换、查找以及分割等功能。gsub(r,s):在输入文件中用s替换rgsub(r,s,t):在t中用s替换rlength(s):返回s的长度,match(s,t):测试s是否包含匹配t的字符串。
[fuwh@localhost 14:59 ~/stu]$ cat tx
fuwh:men:jiangxi
zhangsan:girl:shanghai
lisi:girl:beijing
wangwu:feman:shenzhen
[fuwh@localhost 15:03 ~/stu]$ awk 'BEGIN{FS=":"}{if($1=="fuwh") print(length($3))}' tx
7
  • awk中的语法包括条件语句和循环语句.
if (条件) 动作1 [else 动作2]`
while(条件) 动作
do 动作while(条件表达式)
for(计数器初始值;测试计数器条件;计数器变化)动作
for(变量 in 数组名) 动作
  • 还可以使用in来判断是否在数组中存在索引名 in 数组名,如果存在返回1,如果不存在则返回0.
    感谢!

相关文章

网友评论

      本文标题:[linux] awk

      本文链接:https://www.haomeiwen.com/subject/qknzwqtx.html