Linux awk命令详解
1-1)、基本语法
[root@hadoop1 /]# awk ‘pattern action’ {filename}
A)、书写格式
命令行模式
[root@hadoop1 /]# awk -F":" '{print $1}' /etc/passwd
文本模式
[root@hadoop1 /]# vi testAwk.sh
#!/usr/bin/awk
BEGIN{FS=”:”}
{print $1}
B)、变量
常用内置变量
$0 当前所有的字段
0 - n 系统的内置变量,当前第n个字段
NF 输入来记录的分隔符(默认的是空格)
NR 行号
FS : field separator,读取文件本时,所使用字段分隔符
RS : Record separator,输入文本信息所使用的换行符
OFS : Output Filed Separator,文件分隔符
ORS:Output Row Separator,行分隔符
外置变量
awk -v n="test" 'BEGIN{print n}'
- v :传参的参数
C)、操作符
关系操作符:< , > , <= , >= , == , != , ~ , !~
~ : 表示匹配的意思
!~ : 表示不匹配的意思
例如:[root@hadoop1 /]# awk -F":" '
[root@hadoop1 /]# awk -F":" '
布尔操作符:&& , || , !
D)、 print与printf的区别
print : 直接输出变量值或给定的字符串
Printf: 可以实现格式化输出
[root@hadoop1 /]# awk -F":" '{printf(
1-2)、awk 流程控制
A)、条件
实例一
[root@hadoop1 /]#awk -F":" '{if(
pk
No
***********
实例二
[root@hadoop1 /]#awk -F":" '{if(
$NF :是表示最后一个单词的记录
B)、while语句
实例一
[root@hadoop1 /]#awk -F":" '{i=1;while(i<=NF){print(i,$i);i }{print " "}}' /etc/passwd
实例二
[root@hadoop1 /]# awk -F":" '{for(i=1;i<=NF;i ){print(i,$i)}{print " "}}' /etc/passwd
C)、数组
[root@hadoop1 /]#awk -F":" '{a[$NF] }END{for(i in a){print i":"a[i]}}' /etc/passwd
1-3)、函数
A)、算数函数
int(x) : 返回X的整数部分的值
sqrt(x) : 返回x的平方根
rand() : 返回伪随机数r,其中0<=r<1
srand : 建立rand()新的种子数,如果没有制定就用当天的时间
B)、算数函数
sub(),gsub() : 替换函数
Index(s,t) : 返回子串t在字符串s中的位置,如果没有则返回0
length(s) : 返回字符串长度,当没有给出s时,返回$0的长度
match(s,a,seq) : 使用seq将字符串s分解到数组a中,默认seq伪FS
sub(),gsub() : 替换函数
Index(s,t) : 返回子串t在字符串s中的位置,如果没有则返回0
length(s) : 返回字符串长度,当没有给出s时,返回$0的长度
match(s,a,seq) : 使用seq将字符串s分解到数组a中,默认seq伪FS
C)、自定义函数
[root@hadoop1 /]# awk 'function sum(n,m){total=n m;return total}BEGIN{print sum(5,8)}'
13
1-4)、awk 实战
A)、获取IP地址
[root@hadoop1 /]# ifconfig wlp3s0 | grep -w "inet" | awk '{print $2}'
192.168.199.137
B)、查找制定字段的运行时间
[root@hadoop1 /]# ps -ef|grep java | awk '{print $7}'
00:00:00
C)、对每一个分隔符添加相对应的字符
[root@hadoop1 /]# nl passwd | awk -F":" '{print $1 "*****" $7}'| head -n 5
1root*****/bin/bash
2daemon*****/usr/sbin/nologin
3bin*****/usr/sbin/nologin
4sys*****/usr/sbin/nologin
5sync*****/bin/sync
或
[root@hadoop1 /]# $ nl passwd | awk 'BEGIN{FS=":";OFS="****"}{print $1,$7}' | head -n 5
1root****/bin/bash
2daemon****/usr/sbin/nologin
3bin****/usr/sbin/nologin
4sys****/usr/sbin/nologin
5sync****/bin/sync
记录当前的field个数
$ nl passwd | awk 'BEGIN{FS=":";OFS="****"}{print $1,$7,NF}' | head -n 5
1root****/bin/bash****7
2daemon****/usr/sbin/nologin****7
3bin****/usr/sbin/nologin****7
4sys****/usr/sbin/nologin****7
5sync****/bin/sync****7