Linux—awk工具

       awk:三剑客之一,常用来处理列。
       awk是一门解释型的编程语言,在文本处理领域它是非常强大的,灵活性是awk最大的优势 。
AWK的典型用途
使用AWK可以做很多任务,下面是其中一些

  • 文本处理
  • 输出格式化的文本报表
  • 执行算数运算
  • 执行字符串操作等等

一、awk命令的使用

1.常用命令选项:

  • -F 指定输入分隔符,可以是字符串或正则表达式,如-F:
  • -v var=value 赋值一个用户定义变量,将外部变量传递给awk(每定义一个变量一个参数-v)
  • -f scriptfile 从脚本文件中读取awk命令
  • -v OFS=”\t” OFS变量表示输出分隔符(每定义一个变量一个参数-v)

2.模式和操作:

模式可以是以下任意一个:
awk脚本是由模式和操作来组成的
1.模式可以是以下任意一个

  • /正则表达式/: 使用通配符的扩展集,在”/” “/”这两根斜线之间的是正则表达式
  • 关系表达式: 使用运算符进行操作,可以是字符串或数字的比较测试
  • 模式匹配表达式: 用运算符 ~(匹配)和 ~!(不匹配)
  • BEGIN语句块、pattern语句块、END语句块

2.操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是 :

  • 变量或数组赋值
  • 输出命令
  • 内置函数
  • 控制流语句

3.基本结构:
awk ‘BEGIN{ print “start” } pattern{ commands } END{ print “end” }’ file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分 是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中。
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

4.内置变量:

  • [A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
  • $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
  • $0 这个变量包含执行过程中当前行的文本内容。
  • argc:命令行参数的数目。
  • argind:命令行中当前文件的位置(从1开始算)。
  • argv:包含命令行参数的数组。
  • convfmt:数字转换格式(默认值为%.6g)。
  • environ:环境变量关联数组。
  • erron:后一个系统错误的描述。
  • fieldwidthos:字段宽度列表(用空格键分隔)。
  • filename:当前输入文件的名。
  • FBR:同NR,但相对于当前文件。
  • FS:字段分隔符(默认是任何空格)。
  • ignorecase:如果为真,则进行忽略大小写的匹配。
  • NF:表示字段数,在执行过程中对应于当前的字段数。
  • NR:表示记录数,在执行过程中对应于当前的行号。
  • ofmt:数字的输出格式(默认值是%.6g)。
  • OFS:输出字段分隔符(默认值是一个空格)。
  • ORS:输出记录分隔符(默认值是一个换行符)。
  • RS:记录分隔符(默认是一个换行符)。
  • rstart:由match函数所匹配的字符串的第一个位置。
  • rlength:由match函数所匹配的字符串的长度。
  • subsep:数组下标分隔符(默认值是34)

5.输出版本号
awk --version
在这里插入图片描述

二、awk测试

1.内置变量

awk '{ print $NF }' filename    #打印出一行中的后一个字段;
$(NF-1) awk '{ print NF }' filename     #总字段数,也可组合使用 
awk '{ print $2,$3 }' filename  #指定列 
awk '{ printf("%s^%s\n",$2,$3) }'  filename awk 'END{ print NR }'   filename    
awk 'END{ print NR }'  filename   #统计文件中的行数:下面命令只用了END语句块,在读入每一行的 时,awk会将NR更新为对应的行号,当到达后一行NR的值就是后一行的行号,所以END语句块中的NR就是文件 的行数 
seq 100 | awk 'BEGIN{sum=0} {sum+=$1} END{print "总和:"sum}'  #一个每一行中第一个字段值累加

在这里插入图片描述
注意awk变量不需要 " $ " 引用,大括号中的变量。

2.外部变量传递

VAR=10000
echo  |  awk  -v  VARIABLE=$VAR  '{ print VARIABLE }'   #-v选项,可以将外部值(并非来自stdin) 传递给awk 
var1="aaa" 
var2="bbb" 
echo  |  awk  '{ print v1,v2 }'  v1=$var1 v2=$var2  #变量之间用空格分隔作为awk的命令行参数跟随 在BEGIN、{}和END语句块之后 
echo |  awk  '{print  ENVIRON["PATH"]} '    #shell全局变量传递给awk

3.匹配运算

awk 'BEGIN {a="100testa"; if(a ~ /^100*/) {print "ok";}}'

4.其它运算符

#$     字段引用 
#空格     字符串连接符 
#a>b?y:n    三目运算条件表达式 
#in     数组中是否存在某键值 
awk  'BEGIN{a="b";print a=="b"?"ok":"err";}' 
awk  'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' 
awk  'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

5.高级输入输出

vi filename 
aa 100 
bb 353 
cc 234 
total 1000 
awk '{if($1=="total"){next};print }'  filename #awk中next语句,相当于其他编程语言的continue

6.设置字段定界符

awk  -F:  '{ print $NF }'   /etc/passwd 
awk  'BEGIN{ FS=":" } { print $NF }'   /etc/passwd  
awk  'BEGIN{FS=":"; OFS="-->"} {print $1,$3}'   /etc/passwd #在BEGIN语句块中则可以用OFS=“定界 符”设置输出字段的定界符

7-v 变量赋值选项

awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'Name = Jerry

8.打印文件所有内容

awk '{print}' filename

9. NF 字段数目

 echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值