sed与awk
Posted ywrj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed与awk相关的知识,希望对你有一定的参考价值。
sed
格式
sed 选项 控制命令 文件或标准输入
sed 流程: (循环打印)
sed是将文件里的每一行读入模式空间进行操作,
sed选项
-r 支持正则表达 -n 取消默认打印 清空当前模式空间,读入下一行 -i 同步到文件里的内容 并生成备份文件 -e 执行多条命令 -f 引用sed脚本 |bash 将输出的结果交给bash执行
例: sed -n ‘9s#.*#echo hehe#‘p passwd |bash
hehe
将passwd文件的第9行全部内容替换为echo hehe并交给bash执行
sed命令
sed命令 | 作用 |
a | 追加,在行后追加 |
i | 插入,在行前插入 |
d | 删除 |
c | 替换,很少使用,按行替换 |
s | 替换指定的字符串,后面跟g,g为s命令的全局替换标志 |
p | 输出指定的行,加-n取消默认打印 |
w | 另存文件 sed ‘w 另存文件名‘ 文件名 |
= | 显示行号 ‘1=‘ 显示1行行号,‘1,3=‘显示1-3行号 |
l | 显示文件内看不到的字符串,如$结束符 |
y | 转换字符 |
q | 退出sed |
r | 读取指定文件到行后 |
n | 杜如下一行内容 |
sed指定文件内容的执行范围
sed ‘10‘ 命令 #匹配第10行
‘10,20‘ #匹配10到20行
‘10,+20‘ #匹配10到30行
‘1~2‘ #从第一行开始以2为间隔,匹配结果为奇数行 1,3,5,7,9
‘2~2‘ #从第二行开始以2为间隔.匹配结果为偶数行 2,4,6,8,10
‘10,$‘ #从第10行到最后一行
‘/内容/‘ #匹配到所有指定内容的行
‘/内容1/,/内容2/‘ #匹配从内容1到内容2的所有的行
‘/内容,$/‘ #匹配到内容到结尾的所有的行
‘10,/内容/‘ #从第10行到匹配到内容的行
‘/内容/,10‘ #从匹配到内容的行到底10行
‘/内容/,+20‘ #从匹配到的内容的行开始之后的20行
sed增删改查
增
-a在行后增加
[[email protected] ~]# sed ‘1,3a hehe‘ passwd #在1到3行的行后增加hehe root:x:0:0:root:/root:/bin/bash hehe bin:x:1:1:bin:/bin:/sbin/nologin hehe daemon:x:2:2:daemon:/sbin:/sbin/nologin hehe
-i在行前增加
sed ‘/root/i hehe‘ passwd #在内容为root的行前增加 hehe root:x:0:0:root:/root:/bin/bash hehe operator:x:11:0:operator:/root:/sbin/nologin
删
sed ‘d‘ 文件 #删除文件的所有内容 sed ‘1,10d‘ passwd #删除passwd文件1到10行内容
改
c替换只能替换正行
sed ‘1,20c hehe‘ passwd #将从1到20行的内容全部替换为hehe (1-20全部内容只替换为1个hehe) hehe jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
s 替换匹配到的字符 s# # #
sed -n ‘s#root#123#p‘ passwd #将root替换为123 p打印出来 123:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/123:/sbin/nologin
sed -i ‘s#root#123#g‘ passwd
#将文件passwd内的所有root替换为123 g全局替换,不加g只替换每行匹配到的第一个root 也可以把g写成数字指定替换每行的几个
s的反向引用
[[email protected] ~]# cat 123 aaa bbb ccc ddd eee [[email protected] ~]# sed -nr ‘s#a.* (.*) (.*) .*e#1 2#p‘ 123 ccc ddd s###里的一个() 对应一个1 s#()()()()#1 2 3 4# 1 可以取出 对应第1个括号里的内容 以此类推
&符号
[[email protected] ~]# sed -rn ‘s#a.* (.*) (.*) .*e#所有&内容#p‘ 123 所有aaa bbb ccc ddd eee内容 &代表s#-## 匹配到的所有内容
查
[[email protected] ~]# sed -n 1,3p passwd #查看1到3行 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
sed显示行号打印出来
[[email protected] ~]# sed -n ‘2,4{=;p}‘ passwd |xargs -n2 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin -n 不打印默认输出 2-4行 先=显示行号.在p打印内容{用大括号一起执行},最后交给xargs -n2 指定2个字段为一行 打印出来
AWK
基本操作
-F 指定 分隔符
[[email protected] ~]# cat 1 aa:bb,cc dd -F指定以冒号逗号和空格为分隔符打印4个字段
[[email protected] ~]# awk -F "[,: ]" ‘{print $1" "$2" "$3" "$4}‘ 1 aa bb cc dd
print 打印
[[email protected] ~]# awk "{print}" 1 aa:bb,cc dd
NF 多少字段
[[email protected] ~]# awk -F":" ‘{print NF}‘ passwd 7 1 7 [[email protected] ~]# awk -F":" ‘{print $NF}‘ passwd /bin/bash irgs /sbin/nologin /sbin/nologin
NR 多少行
[[email protected] ~]# awk ‘{print NR,$0 }‘ passwd #打印行号和内容 1 root:x:0:0:root:/root:/bin/bash 2 irgs 3 n catn:x:1:1:bin:/bin:/sbin/nologin [[email protected] ~]# awk ‘NR>3 && NR<6‘‘{print NR,$0}‘ passwd #打印第4行到第5行 行号和内容 4 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 adm:x:3:4:adm:/var/adm:/sbin/nologin
awk循环数组
[[email protected] ~]# cat 1 www.baidu.com www.321.com www.523.com www.baidu.com www.baidu.com www.523.com www.523.com www.huawei.com www.baidu.com www.baidu.com www.523.com www.baidu.com www.523.com www.321.com www.523.com www.baidu.com www.523.com www.huawei.com www.hehe.com www.hehe.com
[[email protected] ~]# awk -F"." ‘{s[$2]=s[$2]+1}END{for(k in s) print s[k],k}‘ 1 2 huawei 7 523 2 321 2 hehe 7 baidu
s[$2]没有定义值所以s[$2]=0,因此s[$2]=s[$2]+1当$2出现1次对应的 s[$2] 做一次+1
k in s 把 k赋值s
k=域名 =$2 后来的覆盖新的
s[k] = s[$3]+1
[[email protected] ~]# cat 12 11 22 22 33 33 44 将第二列数值相加 [[email protected] ~]# cat 12 11 22 22 33 33 44 [[email protected] ~]# awk ‘BEGIN{s=0}{s+=$2}END{print s}‘ 12 99
以上是关于sed与awk的主要内容,如果未能解决你的问题,请参考以下文章