shell编程-awk

34 篇文章 0 订阅

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

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

awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,
分别是alfred aho 、 peter weinberger 、 kernighan。

工作原理

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

语法
awk [options] ‘commands’ filenames
options : 例如-F定义输入字段分隔符,默认的分隔符是空格或制表符
command : BEGIN{} {} END{}
BEGIN----发生在行处理前(注意大写)
{}----行处理时,读一行执行一次
END{}----行处理后

内部变量
FS----输入字段分隔符(默认空格)。自己选择以什么作为分割
OFS----输出字段分隔符
RS----输入记录(行)分隔符,默认换行符
ORS----输出记录(行)分隔符,默认换行符
FNR----多文件独立编号。打开多个文件时每个文件的内容都使用独立的行号
NR----多文件汇总编号。打开多个文件时所有文件的内容只使用一套行号
NF----字段总数。显示每一行都有几个字段

格式化输出

print 函数 :把输入的内容经过处理再显示出来
date |awk ‘{print "Month: " $2 "\nYear: " $1}’
Month: 11月
Year: 2017年
printf 函数 式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。
awk -F: ‘{printf “|%-15s| %-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 |

%s 字符类型
%d 数值类型
%f 浮点型,可以定义保留
占15字符

  • 表示左对齐,默认是右对齐
    printf默认不会在行尾自动换行,加\n
    , 逗号,输出字段分隔符

模式(正则表达)和动作

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

字符串比较
awk ‘/^root/’ /etc/passwd 查找root
awk ‘$0 ~ /^root/’ /etc/passwd 查找行首像是root
awk ‘$0!~/^root/’ /etc/passwd 查找行首不像root
awk -F:’$1 ~ /^root/’ /etc/passwd 查找第一列开头像是root

数值比较
比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,
用于比较数字与字符串。
运算符 含义 示例
小于 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
awk -F: ‘$3 * 10 > 500’ /etc/passwd 查找第三列乘10后小于500

多条件

逻辑操作符和复合模式
&& 逻辑与 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,显示出来,注意避免匹配重复的字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值