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: |
先备份文件,在修改 |
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):显示文件中包含103到110的行
[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
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号码最后一位数字是1或5的人的全名
[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读取文件之前执行 |
END{} |
END{}里面的内容 会在awk读取完文件内容之后运行 |
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
2:access.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;
数字名称【元素/下标】
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的执行过程
3.6 查询帮助
man awk
info awk ======GAWK:Effective AWK Programming