awk 一种编程语言、文本编辑器、也是一种非交互式的编辑器
功能:对文本数据进行汇总和处理,是一个报告的生成器,能够对数据进行排版
一、awk的语法
awk [选项] '/模式匹配(定址)/{处理动作1;处理动作2;... ...; 处理动作n}' 文件列表
要点:
1)逗号分隔,print item1,item2
2)输出的item可以是字符串,变量,数值,字段,自己的表达式
3)省略item(对象),相当于执行print$0
1、设定输入分隔符 -F
分隔符可以是数字、字母、符号和空白
可以同时指定多个分隔符 : / ,
-F "" 以空为分隔符
-F : 单个符号的分隔符
-F :/ 复合分隔符,多个字符组成一个分隔符
对pass.txt(取/etc/passwd文件前十行)文件以:/为分隔符,打印第一个字段,如下:
[root@bogon ~]
root:x:0:0:root
bin:x:1:1:bin
daemon:x:2:2:daemon
adm:x:3:4:adm
lp:x:4:7:lp
sync:x:5:0:sync
shutdown:x:6:0:shutdown
halt:x:7:0:halt
mail:x:8:12:mail
operator:x:11:0:operator
2、awk输出
1)print
打印内容的,内容可以是文件中的内容,也可以跟文件内容毫无关系
[root@bogon ~]# awk '{print "hello"}' pass.txt
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
- print要点:
a、各个输出字段之间用逗号分隔,而输出的时候默认是以空白为分隔符的
b、print后面如果不跟字段,那么默认打印整行
c、print输出时默认是有换行的
2)printf 可以格式化输出的,默认没有换行
使用格式
printf format,item1,item2,... ...,itemn
format的指示符都是以%开头的,后面跟一个字符,如:
%s:表示是字符串
%d:表示十进制数
%f:表示浮点数,其实就是小数 float
%%:表示%本身
%x:表示十六进制数
%o:表示八进制数
%c:表示字符
修饰符:N(数字) 表示显示宽度 %10s
- 表示左对齐,默认是右对齐 %-10s
对于浮点数:
%5.2f : 其中5表示总的显示宽度(整数位+小数位),2表示小数位的位数
%.2f :表示整数位全部保留,小数位保留两位
[root@bogon ~]# awk -F : '{printf "%10s%5d",$1,$3}' pass.txt
root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11
- printf要点:
a、与print不同的是,printf需要指定格式
b、格式其实是用来指定后面每个条目的输出格式的
c、printf默认不会自动打印换行符的,有需要时候手动指定”\n”
d、默认没有输出分隔符
3、awk的操作符
1)算数运算符
-x:表示负数 +x(x):表示正数
x+y x-y x*y x/y x%y x**y 等价于 x^y(x的y次幂)
2)关系运算符
a、数值之间的关系运算符
> < >= <= == !=
打印uid小于等于5的行
[root@bogon ~]
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
awk -F: '$3<=5{print}' pass.txt //打印uid小于等于5的行
awk -F: '$3<=5' pass.txt //打印uid小于等于5的行
b、字符串之间的关系运算符
== !=
x ~ /y/ 匹配正则 其中y可以是正则表达式
打印用户名中含有o的用户的名字
[root@bogon ~]
root
daemon
shutdown
operator
x !~ /y/ 不匹配正则
[root@bogon ~]
bin
adm
lp
sync
halt
mail
3)逻辑运算符
&& 与 || 或 ! 非
打印uid在5到8之间的用户的用户名,UID
[root@bogon ~]# awk -F: '$3>=5 && $3<=10{print $1,$3}' pass.txt
sync 5
shutdown 6
halt 7
mail 8
打印uid大于7或者uid小于5的用户名,UID
[root@bogon ~]# awk -F: '$3>7 || $3<5{print $1,$3}' pass.txt
root 0
bin 1
daemon 2
adm 3
lp 4
mail 8
operator 11
打印uid不大于4的用户名,UID
[root@bogon ~]# awk -F: '! ($3>4){print $1,$3}' pass.txt
root 0
bin 1
daemon 2
adm 3
lp 4
4)赋值运算符
常见的模式
1)空模式:也就是每一行都要做处理的模式
[root@bogon ~]
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
2)正则表达式
a、固定定址
[root@bogon ~]
root
b、范围定址
[root@bogon ~]# awk -F: '/^ro/,/^lp/{print $1}' pass.txt
root
bin
daemon
adm
lp
3)赋值运算
-= *= /= %= ^=
a++ (先引用a原来的值然后再自增1) ++a(先自增1然后再引用a的值)
a-- (先引用a原来的值然后再自减1) --a(先自减1然后再引用a的值)
4、awk的变量
种类:内置变量、自定义的变量
1.内置变量(內建变量)
(1)$0 表示一整行的内容
(2)$1 ~ $100
$1:第一列
(3)与记录相关的变量(记录就是行)
FS(field separator):输入字段分隔符,默认是空白
FS=":"
OFS(Output):输出字段分隔符
RS(record):记录的分隔符,即行的分隔符,输入行分隔
(4)与数据相关的变量
NR(Number of Record):记录数,awk的处理的行的总数,NR在很多情况下可以看成行号
FNR:行号,不会叠加
NF(Number of Field):当前行的字段数
$NF:当前行的最后一个字段的值
$(NF-1):当前行的倒数第二个字段
[root@bogon ~]
1:7:/bin/bash
2:7:/sbin/nologin
3:7:/sbin/nologin
4:7:/sbin/nologin
5:7:/sbin/nologin
6:7:/bin/sync
7:7:/sbin/shutdown
8:7:/sbin/halt
9:7:/sbin/nologin
10:7:/sbin/nologin
[root@bogon ~]
bin:x:1:1:bin:/bin:/sbin/nologin
2.自定义变量
命名:由字母、数字、下划线组成,不能以数字开头,不能使用关键字,最好见名知意
变量名区分大小写
变量可以先定义再使用,也可以直接使用
给变量赋值
变量名=数值
a=5
变量名="字符串" //注意:此处一定有引号
username="root"
[root@bogon ~]
2 loyal