awk
awk简介
- 对文本和数据进行扫描和处理
- 两个特殊模式:BEGIN 和 END
-
awk一次从文件读取一条记录,并将记录存储在字段变量$0中;记录被分割为字段存储在$1,$2,...,$NF(默认使用空格或制表符为分隔符)
-
参数列表
-
POSIX options: GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs分隔符
-v var=val --assign=var=val设置一个变量
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-L [fatal] --lint[=fatal]
-n --non-decimal-data
-N --use-lc-numeric
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
- 打印file文件中的空行并显示Blank line
-
[root@server6 ~]# awk '/^$/ {print "Blank line"}' file
Blank line
Blank line
Blank line
Blank line
Blank line
- 打印主机名
-
[root@server6 ~]# awk '/HOSTNAME/' /etc/sysconfig/network
HOSTNAME=server6.example.com
- 打印空格脚本式
-
[root@server6 ~]# awk -f awk.sh file
Blank line
Blank line
Blank line
Blank line
Blank line
[root@server6 ~]# cat awk.sh
/^$/{print "Blank line"}
[root@server6 ~]# cat file
12121211:12121212
23232323:32232323
34343433:43343434
-
# 打印第一条记录
[root@server6 ~]# echo hello world|awk '{print $0}'
hello world
# 打印最后一个字段数
[root@server6 ~]# echo hello world|awk '{print NF}'
2
# 打印最后一个字段
[root@server6 ~]# echo hello world|awk '{print $NF}'
world
-
# 以:划分,打印第一个字段
[root@server6 ~]# awk 'BEGIN {FS=":"} {print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
-
# 以:,划分,打印第一个字段和第二个字段
[root@server6 ~]# echo 'hello the:world,!'|awk 'BEGIN{FS="[:,]"}{print $1,$2}'
hello the world
- 变量说明
变量名称 | 描述 |
---|---|
argc | 命令行参数个数 |
FILENAME | 当前输入文档的名称 |
FNR | 当前输入文档的当前记录编号 |
NR | 输入流的当前记录编号 |
NF | 当前记录的字段个数 |
FS | 字段分隔符 |
OFS | 输出字段分隔符(默认空格) |
ORS | 输出记录分隔符(默认换行) |
RS | 输入记录分隔符(默认换行) |
-
[root@server6 ~]# cat file1
tian sheng wo cai bi you yong
shao zhuang bu nu li,lao da tu shang bei
[root@server6 ~]# cat file2
ren sheng chu chu shi feng jing
awk shi fei chang qiang da de
chang feng po lang hui you shi
-
# 打印行标
[root@server6 ~]# awk '{print FNR}' file1 file2
1
2
1
2
3
[root@server6 ~]# awk '{print NR}' file1 file2
1
2
3
4
5
-
# 打印每一行字段数
[root@server6 ~]# awk '{print NF}' file1
7
9
# 以:划分,取第一个字段
[root@server6 ~]# awk 'BEGIN {FS=":"} {print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
-
[root@server6 ~]# awk '{print $1,$2}' passwd
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@server6 ~]# awk '{print $1}' passwd
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@server6 ~]# awk 'BEGIN {FS=":"}{print $2}' passwd
x
x
x
x
x
x
x
x
x
[root@server6 ~]# awk 'BEGIN {FS=":"}{print $3}' passwd
0
1
2
3
4
5
6
7
8
操作符 | 语义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
^ | 幂运算 |
++ | 自加1 |
-- | 自减1 |
+= | 相加后赋值给变量 |
> | 大于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
~ | 匹配 |
!~ | 不匹配 |
&& | 与 |
-
[root@server6 ~]# echo "test" |awk 'x=2 {print x+3}'
5
[root@server6 ~]# awk '/^$/{print x+=1}' file1
1
2
3
[root@server6 ~]# cat file1
tian sheng wo cai bi you yong
shao zhuang bu nu li,lao da tu shang bei
-
[root@server6 ~]# df|grep "boot"|awk '{if($4<20000) print "Alart";else print "OK"}'
OK
[root@server6 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 18555904 6354088 12201816 35% /
devtmpfs 485292 0 485292 0% /dev
tmpfs 499968 172 499796 1% /dev/shm
tmpfs 499968 51092 448876 11% /run
tmpfs 499968 0 499968 0% /sys/fs/cgroup
/dev/sda1 303780 154756 149024 51% /boot
tmpfs 99996 0 99996 0% /run/user/0
tmpfs 99996 28 99968 1% /run/user/1000
[root@server6 ~]# awk '{print length()}' file1
0
0
0
29
41