Linux shell编程自动化运维,三剑客之awk原理,语法,内部变量,格式化输出,模式和动作 详细解析

wsk 简单介绍

awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,
分别是Alfred Aho 、Peter Weinberger 、 Kernighan。

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。
数据可以来自标准输入、一个或多个文件,或其它命令的输出。
它支持用户自定义函数和动态正则表达式等先进功能,

awk的处理文本和数据的方式

它逐行扫描文件,从第一行到最后一行,
寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),

使用工作原理

1 awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束
2 然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,
最多达100个字段
(3)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔
成字段并进行处理。该过程将持续到所有行处理完毕

语法结构

awk   [options]   ‘commands’   filenames         (推荐)

= =options

例如,-F 定义输入字段的分隔符,默认的分隔符或制表符(tab)

= =command(时空)

BEGIN{}     END{}

BEGIN{}     begin发生在行处理前(注意大写)
END{}     行处理后
{}      行处理时,读一行执行一次

示例

   echo  "aaa  bbb  ccc  ddd"  |  awk -F":"  '{print  $1}'
aaa  bbb  ccc  ddd
   echo  "aaa  bbb  ccc  ddd"  |  awk  '{print  $1}'
aaa

内部变量

FS        输入字段分隔符(默认空格)
OFS     输出字段分隔符
RS       输入记录(行)分隔符,默认换行符
ORS    输出记录(行)分隔符,默认换行符
FNR     多文件独立编号
NR       多文件汇总编号
NF        显示字段总数

格式化输出

print 函数

[root@localhost ~]# date |awk ‘{print "Month: " $2 "\nYear: " $1}’       \n换行符 想输出文字,用引号
Month: 11月
Year: 2017年

printf 函数

%s       字符类型
%d       数值类型
%f        浮点型,可以定义保留
    占15字符
-          表示左对齐,默认是右对齐
printf       默认不会在行尾自动换行,加\n
      逗号,输出字段分隔符

[root@localhost ~]# awk -F: '{printf "%-10s %-10s %-15s\n", $1,$2,$3}' /etc/passwd | head 
root       x          0              
bin        x          1              
daemon     x          2              
adm        x          3              
lp         x          4              
sync       x          5              
shutdown   x          6              
halt       x          7              
mail       x          8              
operator   x          11  
这是由于xmind的对齐导致的。

模式(正则表达)和动作

概念
模式:可以是条件测试,正则,复合语句
动作:可以是打印,计算等

任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。
如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。
模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。

字符串比较

#awk   ‘/^root/’   /etc/passwd
#awk   ‘$0 ~ /^root/’   /etc/passwd
#awk   ‘$0!~/^root/’   /etc/passwd
#awk -F:   ‘$1 ~ /^root/’   /etc/passwd

数值比较
目的

比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,
用于比较数字与字符串。

关系运算符

语法

运算符   含义   示例
<       小于    x<y
<=     小于或等于     x<=y
==     等于     x==y
!=      不等于    x!=y
=     大于等于    x>=y
> 大于     x>y

示例

# awk -F: '$3 == 0' /etc/passwd 
# awk -F: '$3 == 1' /etc/passwd 
# awk -F: '$3 < 10' /etc/passwd
== 也可以用于字符串判断
# awk -F: '$7 == "/bin/bash"' /etc/passwd
# awk -F: '$1 == "alice"' /etc/passwd

算术 运算
语法

+ - * / %(模) ^次方(2^3) 

示例
# awk -F: '$3 * 10 > 500' /etc/passwd

多条件

逻辑操作符和复合模式

语法

&& 逻辑与 a&&b
|| 逻辑或 a||b
! 逻辑非 !a

学员练习

#awk -F:   '$1~/root/   && $3<=15'	 /etc/passwd
#awk -F:   '$1~/root/   || $3<=15'		 /etc/passwd
#awk -F:   '!($1~/root/ || $3<=15)' 	/etc/passwd

范围模式

语法

awk ‘/从哪里/,/到哪里/’ filename

练习

# awk -F:  '/adm/,/lpd/'  /etc/passwd
从adm到ldp,显示出来,注意避免匹配重复的字段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值