Linux文本处理三剑客之AWK

Linux文本处理三剑客之AWK

AWK简介

awk:(Aho,Weinberger,Kernighan)报告生成器,格式化文本输出

awk版本:New awk(nawk),GNU awk( gawk) Linux使用GUN awk

data]# which awk
/usr/bin/awk
[root@centos7-17 data]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Aug  5 17:28 /usr/bin/awk -> gawk

awk 是gawk的软链接

awk读入一行文本处理一行文本,遍历整篇文章,默认以空白为分隔符将一行文本分成多个域,依次赋给$1,$2,$3…

awk支持标准输入,因此支持管道

awk使用的基本格式:awk [opt] ‘program’ file

  • 其中program的组成:pattern{action statements}
    ==> awk [opt] ‘pattern{action statements}’ file
  • pattern部分决定action语句何时触发
    BEGIN:遍历前,通常用来打印标题
    END:遍历后,通常用来实现汇总
# awk 的常用示例

# ①取tcp连接状态
netstat -tan|awk '/^tcp/{state[$NF]++}END{for(i in state)print i,state[i]}'
ss -tnl | awk 'NR>1 {state[$1]++}END{for(i in state) print i,state[i]}'

# ②取磁盘空间利用率
df | awk -F '[ %]+' '/^\/dev\/sd/{if($5>80)print $1,$5}'
df | awk -F '[ %]+' '/^\/dev\/sd/{print $1,$5}'
df | awk  '/^\/dev\/sd/{print $1,$5}'

# ③计算1+2+3+...+100
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i;}print "sum="sum}'

awk的分割符、域和记录

  • awk处理的一次称为一个记录,默认记录的分隔符为’\n’ 记录用RS表示
  • 将每个记录以分割符切割成多个域,默认分割符’ ’ 分割符用FS表示
  • 将分割符分成的多个域标记为$1,$2,$3…
  • $0 表示所有域,
  • 省略action时,默认执行print $0

awk的常用选项

  • -F “分隔符1|分隔符2” : 指明分割字段时的分割符
    指明时支持使用pattern,同时指明多个分隔符

  • -v var=value :变量赋值,一次变量赋值一个

  • -f file :可以将awk的program写在文件中-f指定执行即可<多次执行的program>

awk的内置变量

  • FS:输入字段分隔符,默认为空白字符

  • OFS:输出字段分隔符,默认为空白字符

  • RS:记录分割符,默认为’\n’

  • ORS:输出记录分割符,默认为’\n’

  • NF:字段数量

  • NR:记录号,如果默认RS,相当于加行号

  • FNR:各文件分别统计记录号,如果默认RS,awk同时处理多文件时,FNR对其文件分别加行号

  • FILENAME:当前文件名

  • ARGC:命令行参数的个数

  • ARGV:数组,保存的是命令行所给定的各参数
    ARGV[0]=awk
    ARGV[1]=file1 …

awk中程序的语法与C语言类似
c语言中argc与agrv表示:

main函数的参数,解释如下:
argc:命令行总的参数的个数,即argv中元素的格式。
*argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数。
argv[0]:指向程序的全路径名。
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向第二个字符串。

awk支持自定义变量

  • 变量定义后使用
  • 区分字符大小写
  • -v var=value
  • 在program中定义

PATTERN:根据pattern条件,过滤匹配的行,再做处理

  • (1)如果未指定:空模式,匹配每一行

  • (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

  • (3) relational expression: 关系表达式,结果为“真”才会被处理
    真:exp结果为非0值,非空字符串
    假:exp结果为空字符串或0值

seq 3 | awk 'i=!i'
    默认 awk 'i' i未定义i=0
    akw '!i' ==> !i=1

seq 10 | awk '{i=!i;print i}'

awk的高级用法

常用的action分类

  • (1) Expressions:算术,比较表达式等
  • (2) Control statements:if, while等
  • (3) Compound statements:组合语句
  • (4) input statements
  • (5) output statements:print等
条件表达式(三目表达式)(三元表达式)
    selector?if-true-expression:if-false-expression

其中算术表达式,比较表达式,if,while,for均采用c语言语法使用

for的特殊语法:遍历数组中的元素
    for(var in array) {for-body}

awk控制语句 ==> { statements;… } 组合语句

awk默认有行的循环, { statements;… } 组合语句 主要是控制行内循环
  • if(condition) {statements;…}
  • if(condition) {statements;…} else {statements;…}
  • while(conditon) {statments;…}
  • do {statements;…} while(condition)
  • for(expr1;expr2;expr3) {statements;…}
  • break
  • continue
  • delete array[index]
  • delete array
  • exit
特殊的循环控制语句:
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
    awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd

awk数组

  • 关联数组:array[index-expression]
  • index-expression:
    (1) 可使用任意字符串;字符串要使用双引号括起来
    (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
    (3) 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
  • 若要遍历数组中的每个元素,要使用for循环
  • for(var in array) {for-body}
  • 注意:var会遍历array的每个索引
高级用法示例:
    1、取出磁盘分区利用率大于80%的分区和利用率
        可再结合Linux命令实现广播
    df | awk -F '[ %]+' '/^\/dev\/sd/{if($5>80)print $1,$5}'

    2、计算1+2+3+...+100,使用time比较性能
awk:time awk 'BEGIN{sum=0;for(i=1;i<=100000;i++){sum+=i;}print "sum="sum}'

CMD:time (seq -s + 100000 |bc)

for:time (for((sum=0,i=1;i<=100000;i++));do let sum+=i; done; echo $sum)

    3、awk去除重复行 <在awk中,变量未定义时为0>
    awk '!line[$0]++' dupfilename
    awk '{!line[$0]++;print $0, line[$0]}' dupfilename <去重原理>

    4、取网络连接状态
    netstat -tan|awk '/^tcp/{state[$NF]++}END{for(i in state)print i,state[i]}'

awk函数
1)数值处理函数:

  • rand():返回0和1之间一个随机数<需要srand()提供种子>
    awk ‘BEGIN{srand();print int(rand()*100%50);}’
  • int():取整

2)字符串处理函数:

  • length(str):返回指定字符串的长度

  • sub(r,s,str):对字符串str搜索r表示模式匹配的内容,并将第一个匹配内容替换为s

  • gsub(r,s,str):字符串str进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

  • split(str,array,[r]):以r为分隔符,切割字符串str,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

3)自定义函数:

  • function name ( parameter, parameter, … ) {
      statementsreturn expression
      }

awk中调用shell命令

  • system命令:可以调用Linux命令
    空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来
例:
    awk 'BEGIN{system("hostname") }' 
    awk 'BEGIN{score=100; system("echo your score is " score) }'

awk脚本

  • 将awk程序写成脚本,直接调用或执行
      <filename.awk>一般带.awk后缀以示区别
      filename.awk需要添加执行权限
  • 向awk脚本中传递参数
      awkfile var=value var2=value2… Inputfile
传递参数需注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。
可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的
变量都需要一个-v参数。
    
    #!/bin/awk -f  <shebang机制>

print 和 printf

print

print格式:print item1, item2, …
print输出:

  • (1) 逗号分隔符
  • (2) 输出item可以字符串,也可是数值;当前记录的字段、变量或awk的表达式
  • (3) 如省略item,相当于print $0
  • (4) 除数字和变量以外其余字符串均要使用""引起来

printf

与printf命令用法一样。

printf格式化输出:printf “FORMAT” ,item1,item2…

  • (1)必须指定FORMAT
  • (2)不会自动换行,需要显示给出换行控制符\n
  • (3)FORMAT中需要分别为后面每个item指定输出格式

格式符:与item一一对应

  • %c:显示字符的ascii码
  • %d,%i:显示十进制整数
  • %e,%E:显示科学计数法数值
  • %f:显示浮点数
  • %g,%G:以科学计数法或浮点形式显示数值
  • %s:显示字符串
  • %u:无符号整数
  • %%:显示%自身

修饰符

  • #[.#]:第一个数字控制显示宽度,第二个数字表示小点后精度。%3.1f
  • -:左对齐(默认右对齐)。%-15s
  • +:显示数值的正负符号。%+d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值