grep/sed/awk
sed(流编辑器):
stream edittor
行编辑器 vim:全屏编辑器
逐行处理
sed:模式空间
默认情况下不编辑原文件,仅对模式空间中的数据做处理,
而后,处理结束后,将模式空间打印到屏幕上;
sed [options]”AddressCommand“ file…
-n:静默模式,不再默认显示模式空间中的内容
-i:直接修改原文件
-e:SCRIPT -e SCRIPT:可以同时-e ‘AddressCommand’ -e ‘AddressCommand’
-f: /PATH/TO/SED_SCRIPT
sed -f /path/to/script file (就是拿路径下的脚本对file进行操作)
-r:表示使用扩展正则表达式
或者:
sed ‘AddressCommand’ file…(两者的区别,在于需不需要转义)
Address:
- StartLine,EndLine
比如1,100 - /RegExp/
/^root/ - /pattern1/,/pattern2/
第一次被pattern匹配到的行开始,至第一次被pattern2匹配到的行结束, - LineNumber
指定的行 - StartLine,+N
从startline开始,向后的N行
Command:
d:删除符合条件的行;
(比如删除/etc/fstab的前两行 sed “1,2d” /etc/fstab)
(比如删除第3行至最后一行,sed ‘3,$d’ /etc/fstab,,(补充,换成“”就会出错))
(比如包含dev的行都给删除掉,sed ‘/dev/d’ /etc/fstab)
(比如删除从第1行往后两行,sed ‘1,+2d’ /etc/fstab)
(比如删除含有/dev的行, sed ‘/dev//d’ /etc/fstab)
(比如删除含有/dev/的行,sed ‘//dev//d’ /etc/fstab(补充,如这两个,要进行转义))
p:显示符合条件的行
(比如显示文件中(a.txt只有a,b,c,d)中的a, sed ‘/a/p’ a.txt,会把符合条件的显示两遍,
而不符合的,也会显示出来,这个就叫做在模式空间中符合条件的打印出来,但同时也会把原文件打印出来,
而删除会在模式空间中把文件中符合条件的删除后进行显示,所以不会有这种情况,所以,为了只显示符合条件
的内容,使用-n选项,即上面说的静默模式)
a \string:在指定的行后面追加新行,内容为”string”
(比如最前面是/的前面添加# hello world以及换行添加hello Easy,sed ‘/^//a # hello world \n hello Easy ‘ /etc/fstab)
i \string:在指定的行前面添加新行,内容为string
r filename:将指定的文件的内容添加至符合条件的行处
(比如,将/etc/login.defs文件内容添加至/etc/fstab的第2行处,sed ‘2r /etc/login.defs’ /etc/fstab)
(比如,添加到最后,sed ‘$r /etc/login.defs’ /etc/fstab)
w filename:将指定范围内的内容另存至指定的文件中;
(比如,将/etc/fstab 中含有oot行存至/tmp/oot.txt,,sed ‘/oot/w /tmp/oot.txt’ /etc/fstab)
s /pattern/string/:查找并替换每一行中第一次被模式匹配到的串
(查找/etc/fstab中含有oot的字符换为OOT,,sed ‘s/oot/OOT’ /etc/fstab)
如果每一行中所有含有oot的都替换,可以加
修饰符:
g(全局替换) sed ‘s/oot/OOT/g’ /etc/fstab
i(忽略大小写)
(比如要替换文件中凡是含有l..e的字符替换成l..er,(如like要替换成liker) sed ‘s/l..e/&r/g’ /etc/fstab)
(比如要替换所有l..e的字符替换成L..e(like换成Like) sed ‘s/l(..e)\L\1/g’ /etc/fstab)(后项引用)
练习:
- 删除/etc/grub.conf文件中行首的空白符
- 替换/etc/inittab文件中”id:3:initdefault:“一行中的数字5
- 删除/etc/inittab文件中的空白行
- 删除/etc/inittab文件中开头的#号
- 取出一个文件路径的目录名称