Linux三剑客之awk命令

一、awk简介

AWK是一个优良强大的文本处理分析工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

二、awk变量
1、内置常用变量
$0           当前记录,当前行所有列

$1~$n        当前记录的第n个字段,字段间由FS分隔

FS           输入域分隔符,等价于命令行-F,默认为空格

NF           当前记录中的字段个数,就是有多少列,列总数,$NF则表示最后一列

NR           已经读取的记录数,就是第几行,行数,从1开始

FNR          当前记录数

RS           输入记录分隔符,默认为换行符(即文本是按一行一行输入)

OFS          输出字段分隔符 默认也是空格

ORS          输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

ARGC         命令行参数个数

ARGV         命令行参数排列

FILENAME     awk浏览的文件名

\t           制表符

\n           换行符
2、自定义变量类型
echo |awk 'i="hello world"{print i}'
echo |awk 'i=1122 {print i}'
3、数组
echo |awk '{a[1]="hello";a[2]="world!";print a[1],a[2]}'
三、awk常用逻辑运算
?                         条件表达操作符

|| && !                   并、与、非

~  !~                     匹配操作符,包括匹配 不匹配正则表达式

+ - * / % ^               算术操作符

++ --                     前缀和后缀

= += -= *= /= %= ^= **=   赋值操作符 

< <= == != >= >           关系操作符   
  
BEGIN                     在输出界面第一行输出相关

END                       在输出界面最后一行输出相关

+ -                       加,减

* / &                      乘,除与求余

+-!                      一元加,减和逻辑非

^***                      求幂

$                         字段引用

空格                       字符串链接符

?:                         三目运算符

ln                         数组中是否存在某个键值

~                         匹配,与==相比不是精确比较

!~                        不匹配,不精确比较

==                        等于,必须全部相等,精确比较

!=                        不等于,精确比较

&&                        逻辑与

||                         逻辑或

+                         匹配时表示1个或1个以上

/[0-9][0-9]+/             两个或两个以上数字

/[0-9][0-9]*/             一个或一个以上数字

-F'[:#/]'                 定义三个分隔符
四、语法格式
格式1:前置命令 | awk [选项] ‘条件{编辑指令}'

格式2:awk [选项] ‘条件{编辑指令}'  文件...

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file

awk [ -F  分隔符 ]  ' /模式/{操作} '   文件名

awk的指令一定要用单引号括起

awk的动作一定要用花括号括起

模式可以是正则表达式、条件表达式或两种组合

如果模式是正则表达式要用/定界符

多个动作之间用;号分开
五、常用命令选项
-F      指定域分隔符(默认为空格或tab键)

-f      指定从脚本文件中读取awk命令

-V      调用外部Shell变量  variable

'  '    引用代码块

BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

//      匹配代码块,可以是字符串或正则表达式

{}      命令代码块,包含一条或多条命令

;       多条命令使用分号分隔

END     结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
环境准备
准备一台Centos6服务器
系统: Centos6.5
内存:1G
cpu: 2核
IP地址: 10.0.0.53
[root@localhost ~]# echo |awk '{print "hello world!"}'
hello world!
[root@localhost ~]# echo '11 22' | awk '{print $1}'
11
[root@localhost ~]# 
[root@localhost ~]# echo |awk 'i="hello world"{print i}'
hello world
[root@localhost ~]# echo |awk 'i=1122 {print i}'
1122
[root@localhost ~]# 
[root@ slave ~]# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:0C:29:B5:87:4D  
          inet addr:172.16.1.22  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:feb5:874d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1800 (1.7 KiB)  TX bytes:1656 (1.6 KiB)
# 截取MAC地址
[root@ slave ~]# ifconfig eth1 | awk '/HWaddr/{print $5}'
00:0C:29:B5:87:4D
[root@ slave ~]# ifconfig eth1 | awk '/Mask/{print $2}'
addr:172.16.1.22
# 截取IP地址
[root@ slave ~]# ifconfig eth1 | awk '/Mask/{print $2}' | awk -F : '{print $2}'
172.16.1.22
[root@ slave ~]# 
ifconfig eth1 | awk '/Mask/{print $4}' | awk -F : '{print $2}'
# 格式化输出
[root@ slave ~]# echo tom jack | awk '{printf("%-30s %-15s\n",$1,$2)}'
tom                            jack           
[root@ slave ~]# echo tom jack lucy | awk '{printf("%-30s %-20s %s\n",$1,$2,$3)}'
tom                            jack                 lucy
[root@ slave ~]# 
[root@ slave ~]# echo 1 3 | awk '{printf("%f\n",$1/$2)}'
0.333333
[root@ slave ~]# echo 1 3 | awk '{printf("%.2f\n",$1/$2)}'
0.33
[root@ slave ~]# 
#  打印系统用户、家目录、以及shell
cat /etc/passwd | awk -F : '{print $1,$6,$7}'
# 打印出来时更规范一些
 cat /etc/passwd | awk -F : '{printf("%-15s" "%-25s %-20s\n",$1,$6,$7)}'
# 添加规范
cat /etc/passwd | awk -F : 'BEGIN {printf("%-13s %-23s %-23s\n","用户","家目录","SHELL")} {printf("%-15s %-25s %-20s\n",$1,$6,$7)}'
# 结尾打印结束信息
cat /etc/passwd | awk -F : 'BEGIN {printf("%-13s %-23s %-23s\n","用户","家目录","SHELL")} {printf("%-15s %-25s %-20s\n",$1,$6,$7)} END {print "处理完毕"}'
[root@localhost ~]# mpstat 
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 	20200105日 	_x86_64_	(2 CPU)

015857秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
015857秒  all    0.06    0.00    0.12    0.08    0.00    0.02    0.00    0.00   99.72
# 取出CPU的使用率和空闲率
[root@localhost ~]# mpstat | awk '/all/{print "使用率:",$3+$5"%"} /all/{print "空闲率:",$11"%"}'
使用率: 0.18%
空闲率: 99.72%
[root@localhost ~]# 
# 截取用户
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
dbus
usbmuxd
vcsa
rpc
rtkit
avahi-autoipd
abrt
rpcuser
nfsnobody
haldaemon
gdm
ntp
apache
saslauth
postfix
pulse
sshd
tcpdump
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF}'
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF}' | wc -l
33
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} /^root/{print NF}' | wc -l
1
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} /^root/{print NF;print NR}'
7
1
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF;print NR}'
7
1
7
2
7
3
7
4
7
5
7
6
7
7
7
8
7
9
7
10
7
11
7
12
7
13
7
14
7
15
7
16
7
17
7
18
7
19
7
20
7
21
7
22
7
23
7
24
7
25
7
26
7
27
7
28
7
29
7
30
7
31
7
32
7
33
[root@localhost ~]# 
[root@localhost ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print NF} END{print NR}'
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
33
[root@localhost ~]# 
[root@localhost ~]# awk -F : -v num=0 '{if($3>=500) sum++} END {print sum}' /etc/passwd
1
[root@localhost ~]# awk -F : -v num=0 '{if($3>=10) sum++} END {print sum}' /etc/passwd
24
[root@localhost ~]# awk -F : -v num=0 '{if($3>=20) sum++} END {print sum}' /etc/passwd
19
[root@localhost ~]# 
[root@localhost ~]# awk -F : '/^root/{i=1;while (i<=3) {print $i;i++}}' /etc/passwd
root
x
0
[root@localhost ~]# 
[root@localhost ~]# awk -F : '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
root
x
0
bin
x
1
daemon
x
2
adm
x
3
lp
x
4
sync
x
5
shutdown
x
6
halt
x
7
mail
x
8
uucp
x
10
operator
x
11
games
x
12
gopher
x
13
ftp
x
14
nobody
x
99
dbus
x
81
usbmuxd
x
113
vcsa
x
69
rpc
x
32
rtkit
x
499
avahi-autoipd
x
170
abrt
x
173
rpcuser
x
29
nfsnobody
x
65534
haldaemon
x
68
gdm
x
42
ntp
x
38
apache
x
48
saslauth
x
498
postfix
x
89
pulse
x
497
sshd
x
74
tcpdump
x
72
[root@localhost ~]# 

.

[root@localhost ~]# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
root
x
0
bin
x
1
daemon
x
2
adm
x
3
lp
x
4
sync
x
5
shutdown
x
6
halt
x
7
mail
x
8
uucp
x
10
operator
x
11
games
x
12
gopher
x
13
ftp
x
14
nobody
x
99
dbus
x
81
usbmuxd
x
113
vcsa
x
69
rpc
x
32
rtkit
x
499
avahi-autoipd
x
170
abrt
x
173
rpcuser
x
29
nfsnobody
x
65534
haldaemon
x
68
gdm
x
42
ntp
x
38
apache
x
48
saslauth
x
498
postfix
x
89
pulse
x
497
sshd
x
74
tcpdump
x
72
[root@localhost ~]# 
[root@localhost ~]# awk -F : '{if ($3>500) print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]# awk -F : '{if ($3>=100) print $0}' /etc/passwd
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
[root@localhost ~]# awk -F : '{if ($3>=100) print $3}' /etc/passwd
113
499
170
173
65534
498
497
[root@localhost ~]# awk -F : '$3>=100{print $3}' /etc/passwd
113
499
170
173
65534
498
497
[root@localhost ~]# 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值