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的主要内容,如果未能解决你的问题,请参考以下文章

sed与awk

sed 与 awk

sed与awk

markdown SED与AWK学习

awk / sed:如果任何字段与模式匹配,则替换所有字段

Linux系列:grep过滤awk拆分sed替换的使用方法与区别