linux三大基本文本处理器:grep,sed(流编辑器),awk
sed 基本用法
sed:stream editor;用来操作纯ascii码文件,行编辑器(全屏编辑器:vi编辑器)
sed:模式空间;sed把符合条件的读入模式空间;默认不编辑源文件,仅仅对模式空间的文本行进行处理。对文件本身不做处理;
最终打印:打印出模式空间中的经过处理后剩下的文本;
#man sed
sed [option] 'AddressCommand' file...
-n:静默模式,只显示符合条件的行;
-i:直接修改源文件;会修改到原文件,注意;
-e script -e script:同时执行多个脚本;
-f /path/to/scriptfile:执行这个文件中的脚本语句;
sef -f /path/to/scripts file;
Address:地址行;Command:命令
sed 'AddressCommand ' file ...
Address:地址指定:
1、StartLine,EndLine;比如:1,100;从第一行到100行;
2、/REGEXP/:使用正则表达式来指定模式;
/^root/:找出所有行中以root开头的行;
3、/pattern1/,/pattern2/:表示第一次被模式一匹配到的行开始到第一次被pattern2匹配到的行结束,中间的所有行;
4、LineNumber:精确的某一行,指定的行;
$:表示最后一行;
5、StartLine, +N;从startline开始,向后N行,总共N+1行;
Command:命令
d:删除符合条件的行;
eg:[root@iZ233y80y23Z ~]# sed "1,2d" /etc/fstab //删除/etc/fstab文件中的1,2行;
#删除从第三行到最后一行
[root@iZ233y80y23Z ~]# sed '3,$d' /etc/fstab
#所有包含vdb的行都删除
[root@iZ233y80y23Z ~]# sed '/vdb/d' /etc/fstab
p:显示符合条件的行:sed显示的模式空间中处理后的行;配合-n使用不然会有问题,会打印两次符合条件的行;
eg:
#显示这种文件中以斜线开头的行
[root@iZ233y80y23Z ~]# sed '/^\//d' /etc/fstab
[root@iZ233y80y23Z ~]# sed -n '/^\//p' /etc/fstab
/dev/vdb /home ext3 defaults 0 0
/dev/vdb /data ext3 defaults 0 0
/dev/vdb /data ext3 defaults 0 0
a \"string":在指定的行后面追加新行,内容为string;\n:换行
eg:
#在符合/开头的行中后面追加新行
[root@iZ233y80y23Z ~]# sed -n '/^\//p' /etc/fstab | sed "a \#hello\nworld"
/dev/vdb /home ext3 defaults 0 0
#hello
world
/dev/vdb /data ext3 defaults 0 0
#hello
world
/dev/vdb /data ext3 defaults 0 0
#hello
world
i \string:在 符合条件的行前面添加新行,内容为string;
r FILE:将指定的文件的内容添加到符合条件处;
eg:
#将指定的文件/etc/issue添加到/etc/fstab中的第二行,插入;文件合并显示;
[root@iZ233y80y23Z ~]# cat /etc/issue
\S
Kernel \r on an \m
[root@iZ233y80y23Z ~]# sed "2r /etc/issue" /etc/fstab
#
\S
Kernel \r on an \m
# /etc/fstab
# Created by anaconda on Fri Nov 21 18:16:53 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=6634633e-001d-43ba-8fab-202f1df93339 / ext4 defaults,barrier=0 1 1
/dev/vdb /home ext3 defaults 0 0
/dev/vdb /data ext3 defaults 0 0
/dev/vdb /data ext3 defaults 0 0
w FILE:将指定范围内的内容另存到指定的文件中;
eg:
#将/etc/fstab中所有以/开头的行插入到文件data/test/fstab.txt中;
[root@iZ233y80y23Z ~]# sed '/^\//w /data/test/fstab.txt' /etc/fstab
s/pattern/string/:查找并替换,默认每行中第一次被模式匹配的字符串;switch;
s###,s@@@分隔符只要三个一样就可以;
加上修饰符
g:全局替换
i:忽略字符大小写
eg:
#把字符串中的/转化为#
[root@iZ233y80y23Z ~]# sed 's/\//#/g' /etc/fstab
#
# #etc#fstab
# Created by anaconda on Fri Nov 21 18:16:53 2014
#
# Accessible filesystems, by reference, are maintained under '#dev#disk'
# See man pages fstab(5), findfs(8), mount(8) and#or blkid(8) for more info
#
UUID=6634633e-001d-43ba-8fab-202f1df93339 # ext4 defaults,barrier=0 1 1
#dev#vdb #home ext3 defaults 0 0
#dev#vdb #data ext3 defaults 0 0
#dev#vdb #data ext3 defaults 0 0
后向引用:\(\),\1,\2;
&:引用模式匹配的整个串;
eg:
#将文件中的sed.txt中的l..e模式匹配下改为l..er;\(\)后向引用\1
[root@iZ233y80y23Z ~]# sed 's#l..e#&r#g' sed.txt
hello, liker
hi, my lover
[root@iZ233y80y23Z ~]# sed 's#\(l..e\)#\1r#g' sed.txt
hello, liker
hi, my lover
#history替换行首中的空格去掉;并显示第一行;
[root@iZ233y80y23Z ~]# history | sed 's#^[[:space:]]*##g' | cut -d' ' -f1