语法格式:
sed -r ‘s#()#1#g’ file # 1 表示获取第一个括号中的内容
sed支持扩展正则需要加r参数
[root@ahui ~]#echo root|sed -r 's#(root)#1#g' root案例2: 匹配字符串调用内容
[root@ahui ~]#echo root ahui|sed -r 's#(root) ahui#1#g' root [root@ahui ~]#echo root ahui|sed -r 's#root (ahui)#1#g' ahui [root@ahui ~]#echo root ahui|sed -r 's#(root) (ahui)#1#g' root [root@ahui ~]#echo root ahui|sed -r 's#(root) (ahui)#2#g' ahui案例3: 支持正则
[root@ahui ~]#echo root ahui|sed -r 's#(r.*t) (ahui)#2#g' ahui [root@ahui ~]#echo root ahui|sed -r 's#(r.*t) (ahui)#1#g' root案例4: 对输出的内容格式化输出
[root@ahui ~]#echo root ahui|sed -r 's#(r.*t) (ahui)#<1><2>#g'案例5: 使用sed后向引用获取IP地址[root@ahui ~]#echo root ahui|sed -r 's#(r.*t) (ahui)#<1> <2>#g'
第一步: 获取ifconfig eth0第二行
使用grep 过滤唯一字符串
[root@ahui ~]#ifconfig eth0|grep netmask inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255 [root@ahui ~]#ifconfig eth0|sed -n '2p' inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
第二步: 将输出的字符串写入替换位置 然后使用后向引用输出结果
[root@ahui ~]#ifconfig eth0|sed -n '2p'|sed -r 's# inet (10.0.0.200) netmask 255.255.255.0 broadcast 10.0.0.255#1#g' 10.0.0.200
第三步: 使用正则表示字符串
[root@ahui ~]#ifconfig eth0|sed -n '2p'|sed -r 's#^.*inet (.*) net.*$#1#g' 10.0.0.200案例6: 通过后向引用将输出结果特殊的符号进行处理
[root@ahui ~]#yum -y install bc
[root@ahui ~]#echo 1+1|bc
2
[root@ahui ~]#echo 1+2+3+4+5+6+7+8+9+10|bc
55
[root@ahui ~]#echo {1..10}+
1+ 2+ 3+ 4+ 5+ 6+ 7+ 8+ 9+ 10+
[root@ahui ~]#echo {1..10}+|bc
(standard_in) 2: syntax error
[root@ahui ~]#echo 1+2+3+4+5+6+7+8+9+10+|bc
(standard_in) 2: syntax error
[root@ahui ~]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
使用sed替换空格为+
[root@ahui ~]#echo {1..10}|sed 's# #+#g'
1+2+3+4+5+6+7+8+9+10
[root@ahui ~]#echo {1..10}|sed 's# #+#g'|bc
55
[root@ahui ~]#echo {1..10}+|sed -r 's#(.*)#1#g'
1+ 2+ 3+ 4+ 5+ 6+ 7+ 8+ 9+ 10+
[root@ahui ~]#
[root@ahui ~]#
[root@ahui ~]#echo {1..10}+|sed -r 's#(.*)#10#g'
1+ 2+ 3+ 4+ 5+ 6+ 7+ 8+ 9+ 10+0
[root@ahui ~]#echo {1..10}+|sed -r 's#(.*)#10#g'|bc
55
[root@ahui ~]#echo {1..10}|tr " " "+"|bc
55
案例: 使用后向引用处理最后输出的字符
[root@ahui ~]#seq 10|tr "n" "+" 1+2+3+4+5+6+7+8+9+10+[root@ahui ~]# [root@ahui ~]#seq 10|tr "n" "+"|sed -r 's#(.*)#1#g' 1+2+3+4+5+6+7+8+9+10+[root@ahui ~]# [root@ahui ~]# [root@ahui ~]#seq 10|tr "n" "+"|sed -r 's#(.*)#10n#g' 1+2+3+4+5+6+7+8+9+10+0 [root@ahui ~]# [root@ahui ~]#seq 10|tr "n" "+"|sed -r 's#(.*)#10n#g'|bc 55案例: 从1加到100
[root@ahui ~]#echo {1..100}|sed 's# #+#g'|bc
5050
[root@ahui ~]#echo {1..100}+|sed -r 's#(.*)#10#g'|bc
5050
[root@ahui ~]#seq -s + 100|bc
5050
案例:ps axuf 输出第五列的结果进行相加
[root@ahui ~]#ps axuf |awk '{print $5}'|tr "n" "+"
VSZ+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+125732+39080+45308+55508+539204+26440+58196+476372+223536+221232+99652+298708+195084+126284+99152+116360+247292+573816+112796+157188+116460+157188+116360+157188+116360+155460+113536+107972+157184+116360+123256+[root@ahui ~]#
[16:36:25 root@oldboyedu ~]#ps axuf |awk 'NR!=1{print $5}'|tr "n" "+1"|sed -r 's#(.*)#10n#g'|bc
4500124
awk
作用:
三剑客老大
- 取行
- 取列
- 编程语言 支持判断 循环 数组
- 支持运算 数据统计
- 格式化输出
语法结构:
-
awk ‘模式’ file 只有模式不写动作(默认为输出动作) 输出的是模式中查找到的所有内容
awk ‘模式{print}’ 默认输出动作 可省略 -
cat file|awk ‘模式{动作}’
-
awk ‘找谁{干啥}’ file
-
awk ‘{动作}’ file 只有动作 处理所有的行
awk内置变量:
第一个: NR 存储着每一行的行号
第二个: $0 存储每一行的内容
第三个: $n 表示第n列
第四个: , 动作{}中的 表示空格
语法格式:
awk ‘NR==3’ file
NR 为awk的内置变量 存储着每一行的行号
在Linux系统中一个= 表示赋值(变量) name=ahui age=100
NR 比较符:
- == 等于n行
- > 大于n行
- >= 大于等于
- < 小于
- <= 小于等于
- != 不等于
- && 并且
- || 或者
[root@ahui ~]#cat passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@ahui ~]#awk 'NR==3' passwd.txt daemon:x:2:2:daemon:/sbin:/sbin/nologin案例2: 查找文件中大于3行的内容
[root@ahui ~]#awk 'NR>3' passwd.txt root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin案例3: 查找文件中大于等于3的内容
[root@ahui ~]#awk 'NR>=3' passwd.txt daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin案例4: 查找文件中小于3的内容
[root@ahui ~]#awk 'NR<3' passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
小于等于等于3
[root@ahui ~]#awk 'NR<=3' passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin案例5: 除了第三行输出其他所有行
[root@ahui ~]#awk 'NR!=3' passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin案例6: 查找NR等于1 并且 NR小于4的行
[root@ahui ~]#awk 'NR==1 && NR<4' passwd.txt root:x:0:0:root:/ahui:/bin/bash案例7: 查找NR等于1 或者NR大于4的行
[root@ahui ~]#awk 'NR==1 || NR>4' passwd.txt root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin案例8: 取出系统中磁盘的使用率的行
查看磁盘: df -h
[root@ahui ~]#df -h|grep '/$' /dev/sda3 19G 2.1G 17G 11% / [root@ahui ~]#df -h|sed -n '2p' /dev/sda3 19G 2.1G 17G 11% / [root@ahui ~]#df -h|sed -n '/sda3/p' /dev/sda3 19G 2.1G 17G 11% / [root@ahui ~]#df -h|awk 'NR==2' /dev/sda3 19G 2.1G 17G 11% / [root@ahui ~]#df -h|awk '//$/' /dev/sda3 19G 2.1G 17G 11% /awk模糊过滤
语法格式:
sed -n ‘//p’ file
awk ‘//’ file
awk ‘//,//’ file # 区间范围
[root@ahui ~]#awk '/root/' passwd.txt root:x:0:0:root:/ahui:/bin/bash root:x:0:0:root:/ahui:/bin/bash案例2: 支持正则 以什么开头 以什么结尾
[root@ahui ~]#awk '/^r/' passwd.txt root:x:0:0:root:/ahui:/bin/bash root:x:0:0:root:/ahui:/bin/bash
以b开头的行
[root@ahui ~]#awk '/^b/' passwd.txt bin:x:1:1:bin:/bin:/sbin/nologin
以n结尾的行
[root@ahui ~]#awk '/n$/' passwd.txt 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
以h结尾的行
[root@ahui ~]#awk '/h$/' passwd.txt root:x:0:0:root:/ahui:/bin/bash root:x:0:0:root:/ahui:/bin/bash案例3: 并且或者
查找以h的行或者以n结尾的行 [root@ahui ~]#awk '/h$/ || /n$/' passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@ahui ~]# [root@ahui ~]#
查找以h结尾的行并且行等于1
[root@ahui ~]#awk '/h$/ && NR==1' passwd.txt root:x:0:0:root:/ahui:/bin/bash案例4: awk的区间范围
[root@ahui ~]#awk '/^b/,/r/' passwd.txt bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash [root@ahui ~]#cat passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@ahui ~]# [root@ahui ~]#awk '/ahui/,/root/' passwd.txt root:x:0:0:root:/ahui:/bin/bash root:x:0:0:root:/ahui:/bin/bash
sed区间范围:
[root@ahui ~]#sed -n '/ahui/,/root/p' passwd.txt root:x:0:0:root:/ahui:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin root:x:0:0:root:/ahui:/bin/bash
唯一值取区间范围
[root@ahui ~]#awk '/linux/,/blog/' ahui.txt I teach linux. test $0 aaaa $# bbbbbb I like badminton ball ,billiard ball and chinese chess! my blog is http: blog.51cto.com [root@ahui ~]#cat 2.txt ahui root lidao root ahui hehe aaaa bbbb [root@ahui ~]#awk '/ahui/,/root/' 2.txt ahui root ahui hehe aaaa bbbb [root@ahui ~]# [root@ahui ~]# [root@ahui ~]#sed -n '/ahui/,/root/p' 2.txt ahui root lidao root ahui hehe aaaa bbbbawk 取列
行: 横向
列: 竖向
awk取列 默认按照空格或者tab键作为分隔符
$0 表示每一行的内容
$1 表示第一列
$2 表示第二列
$n 表示第n列
[root@ahui ~]#awk '{print $0}' 2.txt
ahui root
lidao root
ahui hehe
aaaa bbbb
案例2: 输出文件的第一列内容
[root@ahui ~]#cat 2.txt
ahui root
lidao root
ahui hehe
aaaa bbbb
[root@ahui ~]#awk '{print $1}' 2.txt
ahui
lidao
ahui
aaaa
输出文件的第二列内容
[root@ahui ~]#awk '{print $2}' 2.txt
root
root
hehe
bbbb
案例3: 同时输出第一列和第二列
[root@ahui ~]#awk '{print $2$3}' 2.txt
root123
root234
hehe22
bbbb555
案例4: 输出多列以空格来分隔
[root@ahui ~]#awk '{print $2,$3}' 2.txt
root 123
root 234
hehe 22
bbbb 555
案例5: 以符号作为分隔符使用""
[root@ahui ~]#awk '{print $2"---"$3}' 2.txt
root---123
root---234
hehe---22
bbbb---555
案例6: 输出结果前后加任意内容
注意: 所有的普通字符串在awk中都看作是变量
name=ahui
echo $name
在双引号中所有的特殊符号都看作普通字符串
[root@ahui ~]#awk '{print $2" "$3}' 2.txt
root 123
root 234
hehe 22
bbbb 555
[root@ahui ~]#awk '{print "user "$2" "$3}' 2.txt
user root 123
user root 234
user hehe 22
user bbbb 555
[root@ahui ~]#echo {1..10}+|awk '{print $0"0"}'
1+ 2+ 3+ 4+ 5+ 6+ 7+ 8+ 9+ 10+0
[root@ahui ~]#
[root@ahui ~]#
[root@ahui ~]#echo {1..10}+|awk '{print $0"0"}'|bc
55
案例7: 输出最后一列的内容
[root@ahui ~]#cat 2.txt
ahui root 123
lidao root 234
ahui hehe 22
aaaa bbbb 555
[root@ahui ~]#awk '{print $NF}' 2.txt
123
234
22
555
NF 存储着最后一列的列号
[root@ahui ~]#cat 2.txt
ahui root 123
lidao root 234
ahui hehe 22
aaaa bbbb 555
[root@ahui ~]#awk '{print NF}' 2.txt
3
3
3
3
[root@ahui ~]#cat 2.txt
ahui root
lidao root 234
ahui hehe
aaaa bbbb 555 aaaa
4444
[root@ahui ~]#awk '{print NF}' 2.txt
2
3
2
4
1
[root@ahui ~]#awk '{print $NF}' 2.txt
root
234
hehe
aaaa
4444
NF-1 表示倒数第二列的列数
[root@ahui ~]#awk '{print $(NF-1)}' 2.txt
ahui
root
ahui
555
4444
[root@ahui ~]#
[root@ahui ~]#awk '{print NF-1}' 2.txt
1
2
1
3
0
[root@ahui ~]#cat 2.txt
ahui root
lidao root 234
ahui hehe
aaaa bbbb 555 aaaa
4444
awk 模式+动作
语法格式:
awk ‘{print }’ 动作
awk ‘NR==3’ 模式
awk ‘//’ 模式
[root@ahui ~]#cat 2.txt
ahui root
lidao root 234
ahui hehe
aaaa bbbb 555 aaaa
4444
[root@ahui ~]#awk 'NR==2' 2.txt
lidao root 234
[root@ahui ~]#awk 'NR==2{print}' 2.txt
lidao root 234
获取文件中第二行的第二列
[root@ahui ~]#awk 'NR==2{print $2}' 2.txt
root
[root@ahui ~]#awk 'NR==4' 2.txt
aaaa bbbb 555 aaaa
[root@ahui ~]#
[root@ahui ~]#
[root@ahui ~]#awk 'NR==4{print $3,$4}' 2.txt
555 aaaa
通过模糊查找过滤行 然后执行对应的动作
[root@ahui ~]#awk '/555/' 2.txt
aaaa bbbb 555 aaaa
[root@ahui ~]#awk '/555/{print $2,$1}' 2.txt
bbbb aaaa
案例2: 获取磁盘的使用率
[root@ahui ~]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 2.1G 17G 11% /
devtmpfs 918M 0 918M 0% /dev
tmpfs 929M 0 929M 0% /dev/shm
tmpfs 929M 34M 895M 4% /run
tmpfs 929M 0 929M 0% /sys/fs/cgroup
/dev/sda1 197M 102M 95M 52% /boot
tmpfs 186M 0 186M 0% /run/user/0
[root@ahui ~]#df|awk '//$/{print $(NF-1)}'
11%
awk 指定分隔符
awk默认空格和tab键作为分隔符
在文件中如果没有空格和tab我们可以指定内容作为分隔符来分隔列数
指定分隔符: -F (可指定任意内容长度的字符串)
-F 指定分隔符
[root@ahui ~]#cat passwd.txt
root:x:0:0:root:/ahui:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
root:x:0:0:root:/ahui:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@ahui ~]#awk -F: '{print $1}' passwd.txt
root
bin
daemon
root
adm
lp
第二种写法:加引号
[root@ahui ~]#awk -F ":" '{print $1}' passwd.txt
root
bin
daemon
root
adm
lp
以冒号分隔输出最后一列的内容
[root@ahui ~]#awk -F: '{print $NF}' passwd.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/sbin/nologin
案例2: 使用任意字符串作为分隔符
以.为分隔符符 分成两列
[root@ahui ~]#echo ahui.com
ahui.com
[root@ahui ~]#echo ahui.com|awk -F. '{print $1}'
ahui
[root@ahui ~]#echo ahui.com|awk -F. '{print $2}'
com
[root@ahui ~]#echo ahui.com|awk -Fd '{print $1}'
ol
[root@ahui ~]#echo ahui.com|awk -Fd '{print $2}'
boye
[root@ahui ~]#echo ahui.com|awk -Fd '{print $3}'
u.com
案例3: 统计域名出现的次数取top10 (并且以出现次数的逆序进行排序)
文件中包含以下内容:
http://www.baidu.com/1.html
http://www.sina.com/index.php
http://www.baidu.com/2.html
http://www.sina.com/test.php
http://www.weibo.com/index.html
http://www.baidu.com/index.php
[root@ahui ~]#awk -F "/" '{print $3}' url.txt |sort|uniq -c|sort -rn|head
3 www.baidu.com
2 www.sina.com
1 www.weibo.com
[root@ahui ~]#awk -F "[/]+" '{print $2}' url.txt
www.baidu.com
www.sina.com
www.baidu.com
www.sina.com
www.weibo.com
www.baidu.com
awk 计算
awk ‘BEGIN{读取文件前执行的动作}{读取文件执行的动作}’ file
BEGIN 读取文件之前做什么
END 读取文件后做什么
在awk数组中使用
语法结构:
- awk ‘BEGIN{}’ # 不需要读取文件 直接执行动作
- awk ‘BEGIN{}{}’ file # 读取文件前做什么 读取文件 对读取到的内容做什么
- awk ‘{}END{}’ file # 对文件内容做什么 读取完文件之后做什么
- awk ‘BEGIN{}{}END{}’ # 读取文件前的动作 处理文件内容的动作 读取文件后的动作
[root@ahui ~]#awk 'BEGIN{print "开始"}'
开始
[root@ahui ~]#awk 'BEGIN{print "开始"}{print $1}' 2.txt
开始
ahui
lidao
ahui
aaaa
4444
[root@ahui ~]#awk 'BEGIN{print "开始"}{print $1}END{print "结束...."}' 2.txt
开始
ahui
lidao
ahui
aaaa
4444
结束....
[root@ahui ~]#awk 'BEGIN{print 10+10}'
20
[root@ahui ~]#awk 'BEGIN{print 10*10}'
100
[root@ahui ~]#awk 'BEGIN{print 10-10}'
0
[root@ahui ~]#awk 'BEGIN{print 10/10}'
1
[root@ahui ~]#awk 'BEGIN{print 10^^10}'
[root@ahui ~]#awk 'BEGIN{print 10^10}'
10000000000
不使用BEGIN做运算
[root@ahui ~]#echo 10 20|awk '{print $1,$2}'
10 20
[root@ahui ~]#echo 10 20|awk '{print $1*$2}'
200
[root@ahui ~]#echo 10 20|awk '{print $1+$2}'
30
案例: 统计内存的使用率
查看内存:
[root@ahui ~]#free
total used free shared buff/cache available
Mem: 1901124 123460 1257412 34436 520252 1554848
Swap: 1048572 0 1048572
[root@ahui ~]#free|awk 'NR==2'
Mem: 1901124 123600 1257240 34436 520284 1554704
[root@ahui ~]#free|awk 'NR==2{print $3}'
123724
[root@ahui ~]#free|awk 'NR==2{print $3,$2}'
124764 1901124
[root@ahui ~]#free|awk 'NR==2{print $3/$2*100}'
6.501
输出的结果加%
[root@ahui ~]#free|awk 'NR==2{print $3/$2*100"%"}'
6.50752%
小结:
awk ‘BEGIN{print “任意内容”}’
awk ‘BEEGIN{print 10+10}’
- awk 取行 模式(找谁)
NR 行号
NR==
> >=
< <=
!=
&& ||
- awk ‘NR==3’ file
- awk ‘NR==3 && NR<10’ file
- awk ‘NR==3 && /^r/’ file
- awk ‘NR==3 || NR>5’ file
-
awk 模糊查找
awk ‘//’ file 模糊查找
awk ‘//,//’ file 区间范围 唯一值之间的范围 -
awk 取列 动作
$0 整行内容
$1 第一列- awk ‘{print $1}’ file
- awk ‘{print $1,$2}’ file # 取第一列第二列之间用空格分隔
- awk ‘{print NF}’ file # 最后一列的列号
- awk ‘{print $NF}’ file # 表示最后一列的内容
- awk '{print $(NF-1)}'file # 文件的倒数第二列
在结果前面和后面输出我们想要的内容需要加双引号
awk ‘{print "user: “$1” passwd: "$2}’ -
awk 模式+动作
- awk ‘NR3{print $1}’ file # 第三行的第一列
- awk 'NR3||NR==5{print $1}’# 第三行和第五行的第一列
- awk ‘/root/{print $NF}’ # 输出包含root行的最后一列
- awk -F: ‘{print $NF}’ # 输出文件中所有行的最后一列 -
awk 指定分隔符
- -F “:” 或者 -F:
- awk -F: ‘模式{动作}’ file
- awk -F “[: /]+” ‘模式{动作}’ file
-
awk计算
- awk ‘BEGIN{}’ # 不需要读取文件 直接执行动作
- awk ‘BEGIN{}{}’ file # 读取文件前做什么 读取文件 对读取到的内容做什么
- awk ‘{}END{}’ file # 对文件内容做什么 读取完文件之后做什么
- awk ‘BEGIN{}{}END{}’ # 读取文件前的动作 处理文件内容的动作 读取文件后的动作



