sed后向引用
语法格式:
sed -r ‘s#()#\1#g’ file # \1 表示获取第一个括号中的内容
sed支持扩展正则需要加r参数
案例1: 调用括号中的内容
[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' <root><ahui> [root@ahui ~]#echo root ahui|sed -r 's#(r.*t) (ahui)#<\1> <\2>#g' <root> <ahui>
案例5: 使用sed后向引用获取IP地址
[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#(.*)#\10\n#g' 1+2+3+4+5+6+7+8+9+10+0 [root@ahui ~]# [root@ahui ~]#seq 10|tr "\n" "+"|sed -r 's#(.*)#\10\n#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++39080+45308+55508++26440+58196++++99652++++99152+++++++++++++++++[root@ahui ~]# [16:36:25 root@oldboyedu ~]#ps axuf |awk 'NR!=1{print $5}'|tr "\n" "+1"|sed -r 's#(.*)#\10\n#g'|bc
awk
- 取行
- 取列
- 编程语言 支持判断 循环 数组
- 支持运算 数据统计
- 格式化输出
语法结构:
- awk ‘模式’ file 只有模式不写动作(默认为输出动作) 输出的是模式中查找到的所有内容
awk ‘模式{print}’ 默认输出动作 可省略 - cat file|awk ‘模式{动作}’
- awk ‘找谁{干啥}’ file
- awk ‘{动作}’ file 只有动作 处理所有的行
awk内置变量:
第一个: NR 存储着每一行的行号
第二个: $0 存储每一行的内容
第三个: $n 表示第n列
第四个: , 动作{}中的 表示空格
awk取行
语法格式:
awk ‘NR==3’ file
NR 为awk的内置变量 存储着每一行的行号
- == 等于n行
- > 大于n行
- >= 大于等于
- < 小于
- <= 小于等于
- != 不等于
- && 并且
- || 或者
案例1: 获取文件中的第三行
[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 # 区间范围
案例1: 查找包含root的行
讯享网[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 bbbb
awk 取列
awk取列 默认按照空格或者tab键作为分隔符
$0 表示每一行的内容
$1 表示第一列
$2 表示第二列
$n 表示第n列
案例1: $0 输出所有内容
讯享网[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 ‘//’ 模式
案例1: 模式+动作
讯享网[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 (可指定任意内容长度的字符串)
案例1: 指定: 为分隔符取出passwd中的第一列用户名称
-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{}’ # 读取文件前的动作 处理文件内容的动作 读取文件后的动作
案例1: BEGIN 直接输出内容 加双引号
[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}'
不使用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: 34436 Swap: 0 [root@ahui ~]#free|awk 'NR==2' Mem: 34436 [root@ahui ~]#free|awk 'NR==2{print $3}' [root@ahui ~]#free|awk 'NR==2{print $3,$2}' [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 取行 模式(找谁)
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 模式+动作
- 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{}’ # 读取文件前的动作 处理文件内容的动作 读取文件后的动作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54022.html