Linux awk命令 介绍与学习心得
一.awk是什么?
awk 是一门模式扫描和处理的语言—》专门使用awk进行文本的截取的工具
gawk - pattern scanning and processing language
在我看来,awk也是一门独立的语言,它既可以支持正则也可以支持流控(if…else)。它属于文本处理三剑客之一。(grep、sed、awk)
二.awk命令的简要处理过程
- 存在一个文件 使用awk命令打开之后
- awk逐行读取文件数据进行处理
- Awk 默认以空白为分隔符 将文件的每一行都进行分段处理
- 储存数据从$1 到 $?,$0为整行。
三. awk的完整语法
awk ‘BEGIN{commands}pattern{commands}END{commands}’ filename
例如:
[root@firewall ~]# awk -F: 'BEGIN{print "####start####"}/bash/{print $1,$3} END{print "####end####"}' /etc/passwd
####start####
root 0
sanchuang 1000
cali 1001
####end####
四.awk命令的基本语法
awk -F 分隔符 ‘/模式/{动作}’ 输入文件
^ 放在 [ ]外面 就是开头
放在 [ ]里面就是取反
例子:
[root@firewall ~]# cat /etc/passwd|awk -F: '/^[abc]/{print $1,$3}'
bin 1
adm 3
chrony 998
cali 1001
[root@firewall ~]# cat /etc/passwd|awk -F: '/^[^abc]/{print $1,$3}'
root 0
daemon 2
lp 4
sync 5
shutdown 6
.......
五.awk的命令操作符
例子:
精确匹配:
[root@firewall ~]# cat /etc/passwd|awk -F: '$3==0{print $1,$3}'
root 0
模糊匹配:
[root@firewall ~]# cat /etc/passwd|awk -F: '$1 ~ /x/{print $1,$3}'
postfix 89
nginx 996
单词的界定符:
awk和grep:
- <feng 单词以feng开头
- feng> 单词以feng结尾
- <feng> 就是一个单词feng
grep:
- \b feng 单词以feng开头
- feng\b 单词以feng结尾
- \b feng \b 就是一个单词feng
六.awk的内置变量
- FS (field separater 分隔符)
- OFS (output field separate 输出分隔符)
- NR (number of row)
- NF (number of field)
例子:
[root@firewall ~]# awk -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
....
[root@firewall ~]# awk -F: '{print $1,NR,$NF,NF}' /etc/passwd
root 1 /bin/bash 7
bin 2 /sbin/nologin 7
七.awk如何引用shell变量
1.管道| + awk -v 重新赋值一个变量
例子:
[root@firewall ~]#name=xyy
[root@firewall ~]# echo | awk -v new_name=$name '{print new_name}'
xyy
2.使用双引号和$符号直接引用
例子:
[root@firewall lianxi]# sg=xyy
[root@firewall lianxi]# awk -F: "/^$sg/{print \$0}" /etc/passwd
xyy:x:1003:1004::/home/xyy:/bin/bash
注意:花括号{}里的$符号需要用反斜杠\转义
八.数字求和
[root@firewall ~]# cat a.txt
1
2
3
4
5
6
7
8
9
10
[root@firewall ~]# awk 'BEGIN{i=0} { i=i+$0}END{print i}' a.txt
55
九.awk命令的部分函数
length()
显示用户名长度在5到10之间的用户,并且使用shell为bash,uid大于500.
[root@firewall ~]# cat /etc/passwd|awk -F: 'length($1)>=5&&length($1)<=10&&$NF~/bash/&&$3>500{print $1}'
sanchuang
sc_xyy
流程控制:
[root@firewall ~]# awk -F: '{if($3>500)print $1,$3;else print $0}' /etc/passwd
数组用法:
[root@firewall ~]# cat /etc/passwd | awk -F: '{a[$3]=$1}END{for (i in a)print a[i];print length(a)}'
rr
lp
....
adm
30