shell脚本编程剑客之一:awk

awk使用详解

格式:awk [OPTIONS] ‘pattern + {action}’ file

1、[OPTIONS]

  • -F:指明输入时用到的字段分隔符
  • -f:运行awk脚本文件
  • -v var=value:自定义变量

2、基本语法参数

  1. 单引号’’:为了和shell命令区分开

  2. 大括号{}:表示一个命令分组

  3. pattern:过滤器,表示只有经pattern匹配的内容才进行action处理

  4. action:处理动作,常用的动作为print

  5. #:注释,pattern和action可以只有其一,但不能两者都没有

3、变量

(1)、内置变量

  1. FS:输入分隔符,默认是空格
  2. OFS:输出分隔符,默认是空格
  3. NR:当前行数,从1开始
  4. FNR:各文件分别计数,行数
  5. NF:当前记录的字段数
  6. RS:输入时的换行符
  7. ORS:输出时的换行符
  8. FILENAME:当前文件名
  9. $0:当前所有记录
  10. $1~$n:当前记录第n个列
  11. ARGC:命令行参数的个数
  12. ARGV:数组,保存的是命令行所给定的各参数

(2)、自定义变量

  1. -v var=value:定义变量
  2. 在{pattern+action}中定义变量

4、操作符

(1)、算数操作符

+ - * / ^ %

(2)、字符串操作符

没有符号的操作符,字符串连接

(3)、赋值操作符

=、+=、-=、*=、/=、%=、^=、++、–

(4)、比较操作符

>、<、>=、<=、!=、==

(5)、模式匹配符

~:是否匹配
!~:是否不匹配

(6)、逻辑操作符

&&、||、!

(7)、函数调用

function_name(arg1,arg2,…)

(8)、条件表达式

条件表达式?条件为真语句:条件为假语句
eg:awk -F: ‘{$3>=1000?usertype=“Common User”:usertype=“Sysadmin User”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd

5、PATTERN

  1. empty:空模式,匹配每一行
  2. /regular expression/:处理被此处正则匹配到的行
  3. /relational expression/:关系表达式 eg:’$7=="/bin/bash"’
  4. line ranges:行范围(不能直接用数字表示,可用条件匹配确定行范围
    eg:awk -F: ‘(NR>=2&&NR<=10){print}’ /etc/passwd
  5. BEGIN{}:仅在文件开始处理文本前执行一次
  6. END{}:仅在文本处理后执行一次

6、常见的action

(1)、表达式

(2)、条件控制语句

(1)、if语句

if(condition){} else {};

(2)、while语句

while(condition){};

(3)、do…while语句

do{} while(condition);

(4)、for语句

for(init;condition;step){};

(5)、break/continue语句

break:结束循环
continue:跳出当前层循环

(6)、switch语句

switch(expression){case VALUE1 or /REGEXP1/:{};case VALUE2 or /REGEXP2/:{};…;default:{}}

(7)、next语句

作用:提前结束对本行的处理而直接进入下一行
eg:awk -F: ‘{if($3%2!=0) next;print $1,$3}’ /etc/passwd

(3)、组合语句

(4)、输入语句

(5)、输出语句

7、数组

关联数组:array[index-expression]
index-expression:

  1. 可使用任意字符串,字符串要使用双引号
  2. 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为"空串"

判断数组中是否存在某元素: index in array
eg:
awk ‘BEGIN{weekdays[“mon”]=“Monday”;weekdays[“tue”]=“Tuesday”;weekdays[“wes”]=“wednesday”;if (“mon” in weekdays) {print “yes”} else{print “no”}}’
遍历数组中的每个元素:for(var in array) {}
eg:
awk ‘BEGIN{weekdays[“mon”]=“Monday”;weekdays[“tue”]=“Tuesday”;weekdays[“wes”]=“wednesday”;for (i in weekdays) {print weekdays[i]}}’

state[“LISTEN”]++ :state数组下标为LISTEN的结果数量加1
state[“ESTABLISHED”]++
eg:netstat -tan | awk ‘/^tcp>/{state[$NF]++}END{for(i in state) {print i,state[i]}}’

8、函数

  1. rand():返回0和1之间的一个随机数
  2. length(s):返回s字符串的长度
  3. gsub(r,s):在$0中用s代替r
  4. index(s,t):返回s中t的第一个位置
  5. match(s,r):s是否匹配r
  6. split(s,a,fs):在fs上将s分成序列a
  7. substr(s,p):返回s从p开始的字串

9、printf:格式化输出结果

print FORMAT,item1,item2,…

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

FORMAT格式符

  1. %c:显示字符的ASCII码
  2. %d,%i:显示十进制整数
  3. %e,%E:科学记数法数值显示
  4. %f:显示为浮点数
  5. %g,%G:科学记数法或浮点形式显示数值
  6. %s:显示字符串
  7. %u:显示无符号整数
  8. %%:显示%本身
  9. %n.nf:第一个n控制显示的宽度,第二个n表示小数点后的精度
  10. -:左对齐
  11. +:显示数值的符号

eg:awk -F: ‘{$3>=100?usertype=“Common User”:usertype=“Sysadmin User”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值