当前位置: 移动技术网 > 科技>操作系统>Linux > linux三剑客-awk

linux三剑客-awk

2018年08月23日  | 移动技术网科技  | 我要评论

第1章 awk指哪打哪

1.1 awk内置变量

fs 

输入字段(列)分隔符

-f :

相当于-vfs :

nr 

number of record 行号(记录号)

nf  

number of filed  每行有多少列

ofs

output 输出分隔符

rs 

record separator 记录分隔符每一的结束标记 默认是回车

ignorecase

是否忽略大小写  1为忽略

1.1.1 rs    记录分隔符   每一的结束标记默认是回车

[root@zeq files]# cat passwd.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin     默认结束标记是回车,现在文件内容为两行

以/作为记录分隔符,显示行号和文件内容

[root@zeq files]# awk -vrs="/" '{print nr,$0}' passwd.txt   nr是显示行号   $0是显示一整行的内容

1 root:x:0:0:root:

2 root:

3 bin

4 bash

bin:x:1:1:bin:

5 bin:

6 sbin

7 nologin               现在以/为记录分隔符就变成了7行

这里的awk -vrs="/"     -v给变量赋值,rs是awk内置变量,设置/为记录分隔符

1.2 awk中表示行和列

nr==1

第一行

$1

第一列

$nf

最后一列

$nf-1

倒数第二列

 

1.3 awk模式匹配(条件)

模式-pattern  帮助你找到想要的行

1)正则表达式

2)比较

   >

   <

   ==

3)范围

4)begin{} end{}

1.4 正则表达式

~

某一列中包含xxx

!~

某一列中不包含xxx

^

以....开头的字符(列)

$

以....什么结尾的

.*

所有

^$

空行

\

转义字符 backslash  脱掉马甲打回原形

[]

匹配[]的每一个字符

+

一个字符出现1次或1次以上

|

或者

()

反向引用,一个整体,保护里面的内容

*

一个字符出现0次或者0次以上

{}

0{n,m} 数字0连续出现了至少n次,最多m次

?

一个字符出现0次或1次

1.4.1 awk正则表达式练习

创建环境

mkdir -p /server/files/

cat >>/server/files/reg.txt<<eof

zhang dandan    41117397   :250:100:175             第一列是姓氏

zhang xiaoyu    390320151  :155:90:201              第二列是名字

meng  feixue    80042789   :250:60:50               第一第二列合起来就是姓名

wu    waiwai    70271111   :250:80:75               第三列是对应的id号码

liu   bingbing  41117483   :250:100:175             最后三列是三次捐款数量 

wang  xiaoai    3515064655 :50:95:135

zi    gege      1986787350 :250:168:200

li    youjiu    918391635  :175:75:300

lao   nanhai    918391635  :250:100:175

eof

1.4.2 取出第3列中以数字4开头的行

[root@zeq files]# awk '$3~/^4/' reg.txt    $3 第3列   ~ 包括    ^4 以4开头

zhang dandan    41117397   :250:100:175

liu   bingbing  41117483   :250:100:175

1.4.3 显示xiaoyu的姓氏和id号码

[root@zeq files]# awk ' $2~/xiaoyu/{print $1,$3}' reg.txt  

zhang 390320151

1.4.4 显示所有以41开头的id号码的人的全名和id号码

[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt

zhang dandan 41117397

liu bingbing 41117483

awk默认动作

[root@zeq files]# awk  '$3~/^41/' reg.txt

zhang dandan    41117397   :250:100:175

liu   bingbing  41117483   :250:100:175
[root@zeq files]# awk  '$3~/^41/{print }' reg.txt

zhang dandan    41117397   :250:100:175

liu   bingbing  41117483   :250:100:175

1.4.5 显示所有id号码最后一位数字是1或5的人的全名

方法1

[root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt     []匹配里面的1和5    $表示以...结尾

zhang xiaoyu

wu waiwai

wang xiaoai

li youjiu

lao nanhai
方法2

[root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt     |或者   1或者5

zhang xiaoyu

wu waiwai

wang xiaoai

li youjiu

lao nanhai

1.4.6 显示xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

[root@zeq files]# awk -f: -vofs=$ '/xiaoyu/{print "$"$2,$3,$4}' reg.txt

$155$90$201          -f指定:为分隔符    -vofs=$输出$为分隔符   

1.5 awk替换

gsub  awk内置函数

1.5.1 格式  

gsub(/要替换的内容/,"替换成什么",替换的部分)

1.5.2 接“显示xiaoyu的捐款.每个值时都有以$开头.如$520$200$135”这一题

[root@zeq files]# awk '{gsub(/:/,"$"); print}' reg.txt       把所有的冒号替换成$

zhang dandan    41117397   $250$100$175

zhang xiaoyu    390320151  $155$90$201

meng  feixue    80042789   $250$60$50

wu    waiwai    70271111   $250$80$75

liu   bingbing  41117483   $250$100$175

wang  xiaoai    3515064655 $50$95$135

zi    gege      1986787350 $250$168$200

li    youjiu    918391635  $175$75$300

lao   nanhai    918391635  $250$100$175

加上条件精确到哪一部分

[root@zeq files]# awk '$2~/xiaoyu/{gsub(/:/,"$"); print $nf}' reg.txt     $nf最后一列

$155$90$201

1.6 范围

1、从第1行到第5行内容

awk  'nr==1,nr==5'

2、从包含某个内容的行到包含某个内容的行

awk  '/内容/,/内容/'

1.6.1 显示从第1行到第5行内容

[root@zeq files]# awk 'nr==1,nr==5' reg.txt

zhang dandan    41117397   :250:100:175

zhang xiaoyu    390320151  :155:90:201

meng  feixue    80042789   :250:60:50

wu    waiwai    70271111   :250:80:75

liu   bingbing  41117483   :250:100:175

1.6.2 显示包含xiaoyu到包含waiwai的行

[root@zeq files]# awk '/xiaoyu/,/waiwai/' reg.txt

zhang xiaoyu    390320151  :155:90:201

meng  feixue    80042789   :250:60:50

wu    waiwai    70271111   :250:80:75

1.7 比较表达式

$5>500                第五列大于500

nr>20                 大于第20行的行,20行以后

>  

>=

==

!=                    不等于

<=

< 

1.7.1 查看磁盘信息 df -h

[root@zeq files]# df -h

filesystem      size  used avail use% mounted on

/dev/sda3        19g  7.8g   10g  44% /

tmpfs           491m     0  491m   0% /dev/shm

/dev/sda1       190m   61m  120m  34% /boot

/dev/sdb1       193m  1.8m  181m   1% /data

1.7.2 显示出磁盘使用率大于20%的磁盘分区名称和挂载点(错误范例)

[root@zeq files]# df -h|awk '$5>20{print $1,$nf}'  

filesystem on

/dev/sda3 /

/dev/sda1 /boot

[root@zeq files]# df -h|awk '$5>9{print $1,$nf}'   这里会默认$5>9是字符串(字母)而不是比较表达

filesystem on

1.7.3 解决方法1     指定分隔符只保留数字部分

[root@zeq files]# df -h|awk -f"[% ]+" '$5>9{print $1,$nf}'   

filesystem on

/dev/sda3 /

/dev/sda1 /boot

想要去掉第一列filesystem on信息

[root@zeq files]# df -h|awk 'nr>1 && $5+0>9{print $1,$nf}'   第1行以后(&&并且)

/dev/sda3 /

/dev/sda1 /boot

1.7.4 解决方法2    某一列+0

[root@zeq files]# df -h|awk '$5+0>9{print $1,$nf}'    第5列做比较,第5列加0

/dev/sda3 /

/dev/sda1 /boot

1.8 特殊模式 begin{}  end{}

1)awk执行的过程

  1.执行命令的参数(赋值) -f -v

     2.begin{} 里面的内容 (awk还没有开始读取文件内容)

     3.读取文件内容

        判断是否满足条件(模式)

        符合 执行命令(动作)

        不符合  读取下一行直到最后一行

     4.文件内容读取完成后,开始执行end{}里面的内容

 2)begin{}   里面的内容会在 awk读取文件内容之前执行

        1.显示标题

        2.修改awk内置变量 创建变量

           awk 'begin{ofs=:}'  相当于 awk -vofs=:

        3.测试 计算

3)end{}   awk读取完文件之后 执行

        显示计算结果

        先计算,end显示结果

1.8.1 统计passwd.txt中虚拟用户的数量

[root@zeq files]# cat passwd.txt         查看文件虚拟用户为nologin

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

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

统计数量

[root@zeq files]# awk  '/nologin$/{i=i+1}end{print i}' passwd.txt      i=i+1相当于i++

6

1.8.2 统计/etc/services 文件中空行的数量

[root@zeq files]# awk '/^$/{i++}end{print i}' /etc/services

16

1.9 awk动作

print

gsub 函数 (命令)

变量 计算

1.9.1 计算磁盘使用率

[root@zeq files]# df

filesystem     1k-blocks    used available use% mounted on

/dev/sda3       19534104 8076500  10458644  44% /

tmpfs             502056       0    502056   0% /dev/shm

/dev/sda1         194241   62009    121992  34% /boot

/dev/sdb1         197209    1813    185003   1% /data
[root@zeq files]# df |awk 'nr>1{print $3/$2}'            

0.413456

0

0.319237

0.00919329

1.9.2 查看内存信息   free    free -h

[root@zeq files]# free

             total       used       free     shared    buffers     cached

mem:       1004112     806016     198096        236     101452     563232

-/+ buffers/cache:     141332     862780

swap:       786428        420     786008

1.9.3 计算系统内存的使用率

[root@zeq files]# free |awk '/mem/{print ($3-$6-$7)/$2}'

0.140705

[root@zeq files]# free|awk 'nr==3{print $3/($3+$4)}'

0.140705

1.9.4 计算系统内存的剩余率

[root@zeq files]# free|awk 'nr==3{print $4/($3+$4)}'

0.859211

1.9.5 设置变量计算系统内存的使用率和剩余率

 [root@zeq files]# free|awk 'nr==3{sum=$3+$4;print $3/sum,$4/sum}'    sum为变量

0.140765 0.859235

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网