分享 | 交流
让学习成为一种习惯

初学Linux三剑客之sed

sed命令
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
sed替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
实践:取ip
sed ‘s#支持正则位##g’ file
sed -n ‘s#支持正则位##gp’ file
-r 支持扩展正则表达式
-n 禁止输出模式空间中的内容(选项-n告诉sed,除非是明确表明要输出的行,否则不要给我胡乱输出。一般会配合-p一期使用,意思是说输出那些发生变化的行。)
p 表示打印行
举几个例子吧,给点经典的sed应用。
例一 显示test文件的第10到20行:sed -n ‘10,20p’ test
例二 将所有以d或D开头的行的所有小写x变为大写X:sed ‘/^[dD]/s/x/X/g’ test
例三 删除每行最后的两个字符:sed ‘s/..$//’ test
(有人会问用sed ‘/..$/d’ test为什么不行? 这是因为/..$/表示匹配所有末尾含有两个字符的行,然后删除这样的行,显然这是错误的)
例四 删除每一行的前两个字符:sed ‘s/..//’ test
[root@centos62 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:FC:EF:81
inet addr:10.8.6.62 Bcast:10.8.6.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fefc:ef81/64 Scope:Link
ifconfig eth0|grep ‘inet addr’|awk -F ‘[ :]’ ‘{print $13}’
ifconfig eth0|grep ‘inet addr’|awk -F ‘[ :]+’ ‘{print $4}’
ifconfig eth0|awk -F ‘[ :]+’ ‘NR==2 {print $4}’
ifconfig eth0 |sed ‘2p’ |sed ‘s/^.*addr:/ /g’ |sed ‘s/B.*$ / /g’
ifconfig eth0|sed -n ‘2p’|sed ‘s#.*dr:##g’|sed ‘s# B.*$##g’
ifconfig eth0|sed -n ‘2s#^.*dr:##gp’|sed -n ‘s# B.*$##gp’
ifconfig eth0|sed -n ‘2s#^.*dr:##gp’|sed ‘s# B.*$##g’
ifconfig eth0|sed -nr ‘s#.*dr:(.*) B.*$#\1#gp’
ifconfig eth0|sed -nr ‘s#[^1]+(.*) B.*$#\1#gp’ #[^1]匹配不包含1后面的任意一个字符
ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 213.183.48.222 netmask 255.255.255.0 broadcast 213.183.48.255
inet6 2a06:f900:1:100::115 prefixlen 56 scopeid 0x0<global>
ifconfig eth0|sed -nr ‘/inet /p’|awk ‘{print $2}’
ifconfig eth0|sed -nr ‘s/.*inet (.*) netmask.*$/\1/gp’
sed后向引用
sed -nr ‘s#()()#\1\2#gp’file
当前面匹配部分用小括号的时候,第一个扩号可以在后面部分用\1(接住)输出
同理,第二个括号可以在后面部分用\2输出,再有更多的括号,依次\3,\4…接住
例子
echo “i am oldboy boy。”> a.txt
sed -nr ‘s#^.*m (.*) l.*$#\1#gp’ a.txt
打印结果:把以“:”为分隔符的第一 列和最后一列对调
[root@centos62 ~]# tail -5 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
sed -nr ‘s#([^:]+)(:.*:)(/.*$)#\3\2\1#gp’ /etc/passwd
/sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
/sbin/nologin:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:rpc
/sbin/nologin:x:29:29:RPC Service User:/var/lib/nfs:rpcuser
/sbin/nologin:x:65534:65534:Anonymous NFS User:/var/lib/nfs:nfsnobody
/sbin/nologin:x:48:48:Apache:/var/www:apache
[root@centos62 ~]# stat /etc/hosts #取644
File: `/etc/hosts’
Size: 242 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 131101 Links: 1
Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-03-19 05:42:44.749104491 +0800
Modify: 2017-03-18 11:16:18.246400802 +0800
Change: 2017-03-18 11:16:18.248400876 +0800
stat /etc/hosts|sed -nr ‘s#^.*\(0(.*)/-.*$#\1#gp’
stat /etc/hosts|sed -nr ‘s#[^6]+(.*)/-.*$#\1#gp’
stat /etc|sed -n ‘4p’|awk -F ‘[(/]’ {‘print $2’} #定义有多个分隔符的用[]括起来
stat /etc|sed -n ‘4p’|cut -d “/” -f1|cut -d “(” -f2
stat /etc/|head -4|tail -1|cut -d “/” -f1|cut -d “(” -f2
stat /etc/|head -4|tail -1|awk -F “/” ‘{print $1}’|awk -F “(” ‘{print $2}’
stat /etc/|sed -nr ‘s#[^0]+(.*)/dr.*$#\1#gp’
stat /etc/|grep “Access: (0″|cut -c 10-13

未经允许不得转载:留时刻运维网 » 初学Linux三剑客之sed

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留时刻 - Linux系统教程,运维经验分享

加入我们给我留言