awk命令是一个异常复杂的命令。了解常用的用法。
功能:文件中截取我们需要的数据
#awk '条件1{动作1}条件2{动作2}...' 文件名
说明:
条件(Pattern)
- 一般使用关系表达式作为条件
- x>10判断变量 x是否大于10
- x>=10 大于等于10
- x<=10 小于等于10
动作(Action)
- 格式化输出
- 流程控制语句
例如:
[root@localhost home]# cat student.txt
ID Name gender Mark
1 furong F 88
2 fengjie F 60
3 cang F 70
查看文件student.txt第二列和第四列
[root@localhost home]# awk '{printf $2 "\t" $4 "\n"}' student.txt
Name Mark
furong 88
fengjie 60
cang 70
说明
- awk一行一行的的读取文件
- 判断条件,如果条件满足,则执行动作
- 把文件名赋值给$0字段,将ID赋值给$1字段,依次类推
- awk默认是空格或者制表符做为分隔符
- 没有条件限制就是无条件显示执行动作
- 仅仅是提取制表符和有规律的
示例:
[root@localhost home]# df -h | awk '{print $5}'
Use%
21%
0%
30%
1%
1%
[root@localhost home]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 5.9G 1.2G 4.5G 21% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 54M 127M 30% /boot
/dev/sda2 9.5G 23M 9.0G 1% /home
/dev/sda5 1.9G 3.1M 1.8G 1% /usr/local
[root@localhost home]# df -h | grep "/dev/sda6" | awk '{print $%}'
awk: {print $%}
awk: ^ syntax error
[root@localhost home]# df -h | grep "/dev/sda6" | awk '{print $5}'
21%
[root@localhost home]# df -h | grep "/dev/sda6" | awk '{print $5}' | cut -d "%" -f 1
21
示例2
[root@localhost home]# cat student.txt
ID Name gender Mark
1 furong F 88
2 fengjie F 60
3 cang F 70
[root@localhost home]# awk 'BEGIN{print "this is a test"}{print $2 "\t" $4}' student.txt
this is a test
Name Mark
furong 88
fengjie 60
cang 70
[root@localhost home]# awk 'END{print "this is a test"}{print $2 "\t" $4}' student.txt
Name Mark
furong 88
fengjie 60
cang 70
this is a test
BEGIN作用,awk默认是用空格或者制表符进行分割的。BEGIN作用是设定变量来做分隔符。如果不写BEGIN,则awk会从读取第一行后才能执行按照分隔符分割的。
[root@localhost home]# cat /etc/passwd |grep "/bin/bash"
root:x:0:0:root:/root:/bin/bash
imooc:x:502:889:kk,kk,kk,kk:/home/xxx:/bin/bash
cls:x:500:889:dgdzmx:/home/cls:/bin/bash
user1:x:503:503::/home/user1:/bin/bash
tony:x:504:504::/home/tony:/bin/bash
lw:x:505:505::/home/lw:/bin/bash
user2:x:506:506::/home/user2:/bin/bash
[root@localhost home]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3}'
root 0imooc 502cls 500user1 503tony 504lw 505user2 506[root@localhost home]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
root 0
imooc 502
cls 500
user1 503
tony 504
lw 505
user2 506
[root@localhost home]# cat /etc/passwd |grep "/bin/bash" |grep -v "root" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
imooc 502
cls 500
user1 503
tony 504
lw 505
user2 506
[root@localhost home]#