awk\sed\grep的使用

时间:2021-04-28 22:26:24

 

1     grep

1.1   参数:

-v:

取反、按行排除,【^abc-->abc之外,【abc】--->包含abc

-E:

grep支持扩展正则,==egrep

-o:

显示执行过程(显示正则每次匹配到的内容)

-c:

统计行数,wc -l

-i:

忽略大小写 -ignore-case(find  -iname也是忽略大小写)

-l:

过滤的时候只显示文件名 ,不显示文件内容

-A

After,[root@localhost files]# grep -A2 oldboy person.txt

显示oldboy这行以及下面2行

-o

显示执行过程

1.2   案例:

书写脚本,判断crond是否在运行

1)如果在运行提示

crond is running        [ok]

2)如果没有在运行提示

crond is  not running    [Failed]

 

第一步:检查进程时

[root@localhost files]# ps -ef |grep  crond

显示正在运行的进程

root       1390      1  0 14:27 ?        00:00:00 crond

root       1634   1596  0 14:44 pts/0    00:00:00 grep crond

 

第二步:脚本名字不能包含服务名称

法一:过滤grep自己

[root@localhost files]# ps -ef |grep  crond|grep -v grep

root       1390      1  0 14:27 ?        00:00:00 crond

 

 法二:精确过滤想要的

[root@localhost files]# ps -ef |grep  '[c]rond'

root       1390      1  0 14:27 ?        00:00:00 crond

 

[root@localhost files]# ps -ef |grep -c  '[c]rond'

       -c:统计行数

第三步:写脚本

/bin/bash

. /etc/init.d/functions   #加颜色,系统预定义的功能(函数)

count=`ps -ef|grep -c '[c]rond'`

 

if [ $count -eq 1 ];

        action "crond is running"  /bin/true

else

        action "crond is not running" /bin/false

fi

 

 

2     sed

2.1   参数:

-n:

取消默认输出

-r:

支持扩展正则

-i:

先备份文件,在修改
不要写成-ir-----》先备份为   文件名r   文件名

Sed -n   '3p'    oldboy.txt

3p:条件命令,p是显示

2.2   查

(1):显示第2行

Sed -n   '2p'    oldboy.txt

(2):显示文件passwd第3行和第10行

[root@localhost files]# sed -n '3p;10p' /etc/passwd

daemon:x:2:2:daemon:/sbin:/sbin/nologin

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

(3):显示文件passwd第3行到第10行

[root@localhost files]# sed -n '3,10p' /etc/passwd

(4):找出person.txt文件中包含oldboy的行

Sed -n '//p'

[root@localhost files]# sed -n '/oldboy/p' oldboy.txt

5:显示文件中包含103110的行

[root@localhost files]# sed -n '/103/,/110/p' person.txt

 

6:显示包含yy的行到文件最后一行的内容

[root@localhost files]# sed -n '/yy/,$p' person.txt

104,yy,CFO

105,feixue,CIO

110,lidao,COCO

7:特别用法

显示包含oldboy以及oldboy下面两行

[root@localhost files]# sed -n /oldboy/,+2p person.txt

显示第一行以及第一行下面的两行

[root@localhost files]# sed -n '1~2p' person.txt

101,txt

103,Alex,COO

105,feixue,CIO

2.3   增

参数

含义

a

append追加  指定行后面追加

i

Insert 插入  指定行前面追加

c

Replace 替换  把这一行的内容替换为你写的

追加20,maolaoshi,UFO到3行后面

[root@localhost files]# sed '3a20,maolaoshi,UFO' person.txt

101,txt

102,ail

103,Alex,COO

20,maolaoshi,UFO

 

[root@localhost files]# sed '3a20,maolaoshi,UFO\n24,lao' person.txt

101,txt

102,ail

103,Alex,COO

20,maolaoshi,UFO

24,lao

[root@localhost files]# sed '3c120,maolaoshi,UFO\n24,lao' person.txt

101,txt

102,ail

120,maolaoshi,UFO

24,lao

104,yy,CFO

105,feixue,CIO

110,lidao,COCO

 

[root@localhost files]# sed '3i120,maolaoshi,UFO\n24,lao' person.txt

101,txt

102,ail

120,maolaoshi,UFO

24,lao

103,Alex,COO

2.4   删

d

(delete)

1d

删第一行

/oldboy/d

删oldboy行

2.5   改

‘s###g’

后向引用

2.5.1 案例:

把/etc/passwd 第1列和最后一列调换位置

准备好环境

head /etc/passwd >passwd.txt 

修改

2.5.1.1  法一:

[root@localhost files]# sed -r 's#^(.*?):(.*):(.*?)$#\3\2\1#g' passwd.txt

^(.*?):(.*):(.*?)

(.*?):表示到第一个:前面,为什么加?,因为要取消正则的贪婪性
(.*)表示一直到最后一个:
(.*?)表示最后一个部分

 

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

/sbin/nologin:/bin:bin:x:1:1:bin

/sbin/nologin:/sbin:daemon:x:2:2:daemon

/sbin/nologin:/var/adm:adm:x:3:4:adm

/sbin/nologin:/var/spool/lpd:lp:x:4:7:lp

/bin/sync:/sbin:sync:x:5:0:sync

/sbin/shutdown:/sbin:shutdown:x:6:0:shutdown

/sbin/halt:/sbin:halt:x:7:0:halt

/sbin/nologin:/var/spool/mail:mail:x:8:12:mail

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

https://www.processon.com/view/link/5b78e46be4b067df5a0f903f

2.5.1.2   法二: 

[root@localhost files]# egrep -o '^[^:]+'  passwd.txt

 

-o

显示执行过程

[^:]+

取反

^[^:]+

取消贪婪性

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

 

[root@localhost files]# sed -r 's#(^[^:]+)(.*:)(.*)#\3\2\1#g' passwd.txt

 

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

2.6    补充

‘’和“”的区别

‘:所见即所得

“:里面的特殊符号有特殊意义

 

3     awk

3.1   参数:

-F:

指定分隔符,-F 修改awk内置变量FS(field-separator)

-v

修改或创建awk的变量

-f

指定脚本

 

3.2   案例:

1:统计磁盘使用率大于50%

[root@localhost files]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root

                       18G  4.7G   12G  29% /

tmpfs                 491M     0  491M   0% /dev/shm

/dev/sda1             477M   36M  417M   8% /boot

/dev/sr0              3.7G  3.7G     0 100% /media

[root@localhost files]# df -h | awk '$5>50'

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1             477M   36M  417M   8% /boot

 

2:-v的使用 

 

[root@localhost files]# df -h | awk 'NR >1&&$5>50'

NR:行)

 

/dev/sda1             477M   36M  417M   8% /boot

 

[root@localhost files]# awk -va=5 'BEGIN{print a}'

变量a=5

 

5

[root@localhost files]# awk -va=5 'BEGIN{print a^a}'

3125

 

 3:打印第一列

法一:

[root@localhost files]# awk -F:   '{print $1}' passwd.txt

-F:指定分隔符

root

bin

daemon

 法二:

[root@localhost files]# awk -vFS=:   '{print $1}' passwd.txt

root

bin

daemon

3.3   awk的格式:

awk -F:   'NR==1{print  $1,$3}'

                    '条件{动作}'

3.3.1 条件

3.3.1.1  正则表达式(支持扩展正则)

^

以…开头的字符串

&

让程序在后台运行

$

以…结尾的字符串

*

0次或多次

!

取反?????

.*

所有

[]

中括号里面任意一个字符[abc]

+

出现1次以及1次以上

|

{}

前一个字符出现几次{n,m}

()

分组

?

0次或1次

3.3.1.1.1     案例

环境:

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

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显示第3列中以4开头的

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

'$3~/^4

~:表示匹配;匹配第3列中以4开头的

 

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

 

2:显示Xiaoyu的姓氏和ID号码

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

Zhang 390320151

Zhang 390320151

 

[root@localhost files]# awk '/Xiaoyu/' reg.txt

 

注意:/Xiaoyu/相当于$0~/Xiaoyu/相当于/Xiaoyu/{print $0}

3:显示所有以41开头的ID号码的人的全名和ID号码

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

Dandan 41117397

Bingbing 41117483

Dandan 41117397

Bingbing 41117483

 

4:显示所有ID号码最后一位数字是15的人的全名

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

Xiaoyu 390320151

Waiwai 70271111

Xiaoai 3515064655

Youjiu 918391635

Nanhai 918391635

Xiaoyu 390320151

Waiwai 70271111

Xiaoai 3515064655

Youjiu 918391635

Nanhai 918391635

 

[root@localhost files]# awk '$3~/[15]$/{print $2,$3}' reg.txt|column -t

 

column -t

对齐显示

Xiaoyu  390320151

Waiwai  70271111

Xiaoai  3515064655

Youjiu  918391635

Nanhai  918391635

Xiaoyu  390320151

Waiwai  70271111

Xiaoai  3515064655

Youjiu  918391635

Nanhai  918391635

 

 

5:显示Xiaoyu的捐款.每个值时都有以$开头.$520$200$135

 

法一:

 

[root@localhost files]# awk '/Xiaoyu/{print $4}' reg.txt|tr ":" "$"

$155$90$201

$155$90$201

法2:

[root@localhost files]# awk '/Xiaoyu/{print $4}' reg.txt|sed 's#:#$#g'

's#:#$#g

s:substitite

 

$155$90$201

$155$90$201

 

法3:

[root@localhost files]# awk '{gsub(/:/,"$");print}' reg.txt

Zhang Dandan    41117397   $250$100$175

Zhang Xiaoyu    390320151  $155$90$201

Meng  Feixue    80042789   $250$60$50

 

[root@localhost files]# awk '/Xiaoyu/{gsub(/:/,"$");print}' reg.txt

Zhang Xiaoyu    390320151  $155$90$201

Zhang Xiaoyu    390320151  $155$90$201

 

 

gsub(//,"",$NF)

(把谁,替换成什么,在哪里替换)

gsub(//,"")

相当于gsub(//,"",$0)

 

3.3.1.2  比较表达式(如NR==1)

显示出系统磁盘分区使用率大于20%的磁盘 设备名称和挂载点

[root@localhost files]# df -h|awk '$5>20{print $1,$NF}'|column -t

Filesystem  on

/dev/sda1   /boot

去掉第一行的方法:

法1:

[root@localhost files]# df -h|awk '$5>20&&NR>1 {print $1,$NF}'|column -t

/dev/sda1  /boot

 法2:

强制转换--》第5列的内容转换为数字

[root@localhost files]# df -h|awk 'int($5)>20 {print $1,$NF}'|column -t

/dev/sr0  /media

 

3.3.1.3  范围的表达式(如1,3p)

1:显示第几行到第几行

[root@localhost files]# awk 'NR==1,NR==3' reg.txt

Zhang Dandan    41117397   :250:100:175

Zhang Xiaoyu    390320151  :155:90:201

Meng  Feixue    80042789   :250:60:50

[root@localhost files]# awk '/101/,/104/' person.txt

101,txt

102,ail

103,Alex,COO

104,yy,CFO

 

2:显示{}中lidao出现的次数

准备环境:

cat >>lidao.txt<<EOF

oldboy

lidao

oldboy

{

lidao 

lidao 

lidao 

lidao 

lidao 

}

lidao

oldboy

{

lidao 

lidao 

lidao 

lidao 

lidao 

}

EOF

[root@localhost files]# awk '/{/,/}/' lidao.txt

{

lidao

lidao

lidao

lidao

lidao

}

{

lidao

lidao

lidao

lidao

lidao

}

[root@localhost files]# awk '/{/,/}/' lidao.txt |grep lidao -c

10

 

3.3.1.4   特殊的条件

BEGIN{}

BEGIN{}里面的内容 会在awk读取文件之前执行
1:简单计算
2:测试
3:修改awk内置变量
-vFS:相当于BEGIN{FS:}

END{}

END{}里面的内容  会在awk读取完文件内容之后运行
1:显示计算结果
先计算,最后END{}显示结果

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

法一:

[root@localhost files]# awk '/^$/' /etc/services|wc -l

16

法二:

[root@localhost files]# grep '^$' /etc/services|wc -l

16

法三:

[root@localhost files]# awk '/^$/{i=i+1;print NR,i}' /etc/services

i =i+1 

 统计数量  一共有多少个         统计

 

22 1

266 2

299 3

320 4

326 5

393 6

461 7

474 8

479 9

486 10

494 11

506 12

512 13

518 14

583 15

584 16

[root@localhost files]# awk '/^$/{i=i+1}END{print i}' /etc/services

16

 

2access.log  1 ip地址  7列 访问的网站的文件 第10列 每个资源的大小(图片 页面)                  

  

统计一共使用了多少流量

 

[root@localhost files]# awk  '{i=i+$10}END{print i}' access.log

2478496663

 

[root@localhost files]# awk  '{i=i+$10}END{print i/1024^3"GB"}' access.log

2.30828GB

3:计算1+。。。。+10的结果

[root@localhost files]# seq 10|awk  '{i=i+$1}END{print i}'

55

 

小结:

i= i+1

计数i++

i=i+$xxx

计算求和 i += $xx

3.4   awk数组

h[120]="lidao;

数字名称【元素/下标】

 

awk\sed\grep的使用 

1:统计每个域名出现的次数(去重统计次数)

环境:

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

 

[root@localhost files]# awk -F"[/.]+"  '{print $2}' url.txt

 

www

www

post

mp3

www

post

[root@localhost files]# awk -F"[/.]+"  '{print $2}' url.txt|sort

 

Sort

排序

 

mp3

post

post

www

www

www

 

[root@localhost files]# awk -F"[/.]+"  '{print $2}' url.txt|sort|uniq -c

Uniq

这个只在相邻的去重

 

      1

      1 mp3

      2 post

      3 www

 

[root@localhost files]# awk -F"[/.]+"  '{print $2}' url.txt|sort|uniq -c|sort -rn

      3 www

      2 post

      1 mp3

      1

 

2:显示awk数组内容

[root@localhost files]# awk 'BEGIN{h[120]="lidao";h[12306]="ma" ;print h[120],h[12306]             }'

lidao ma

 

[root@localhost files]# awk -F"[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' url.txt

 

3 2 1

 

 

[root@localhost files]# awk -F"[/.]+" '{h[$2]++}END{for (p in h) print p}' url.txt

 

www

mp3

post

 

[root@localhost files]# awk -F"[/.]+" '{h[$2]++}END{for (p in h) print p,h[p]}' url.txt

 1

www 3

mp3 1

post 2

3:统计secure文件中 每个用户被破解的次数

[root@localhost files]# awk '/Failed/{print $(NF-5)}' secure-20161219|head

support

admin

uucp

business

business

business

ftp

ftp

ftp

root

 

[root@localhost files]# awk '$6~/Failed/{h[$(NF-5)]++}END{for (k in h) {print k, h[k]}}' secure-20161219 | sort -nrk2 | head|column -t

root      364610

admin     733

user      246

oracle    119

support   104

guest     79

test      70

ubnt      47

pi        41

webadmin  36

 

 

4:统计access.log中每个ip地址使用的流量(显示前10名)

[root@localhost files]# awk '{h[$1]+=$10}END{for (p in h)print p,h[p]}' access.log |sort -hrk2|head

114.83.184.139 31362956

117.136.66.10 22431302

116.216.30.47 21466000

223.104.5.197 21464856

116.216.0.60 19145329

114.141.164.180 17219553

114.111.166.22 17121524

223.104.5.202 16911512

116.228.21.187 15969887

112.64.171.98 15255013

3.5   awk的执行过程 

 awk\sed\grep的使用

 

3.6   查询帮助

man  awk

info awk   ======GAWK:Effective AWK  Programming