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,显示出来,注意避免匹配重复的字段。