三贱客之sed
1,grep:文本搜索工具
grep家族有三款工具:egrep,fgrep
sed:全程stream editor,sed是流编辑器
sed和其他一样,只是把文本提取到内存中来进行编辑
awk(gawk):文本格式化工具,也可以称作文本报告生成器
以上三者在功能有重叠的地方,但是他们还是有各自的特色
sed命令:
在sed命令介绍之前,先看看正则表达式元字符:
字符匹配:., 任意单个字符,[]指定范围内单个字符,[^]指定范围外单个字符
次数指定:*前面字符任意次,\?零次或多次,\+一
次或多次 ,\{m,n}匹配指定次数,\{n\}精确匹配n此
位置锚定:^行首,$行尾,\<单词首部,\>单词尾部
分组和引用:\()分组,\1,\2,...引用
或者,多选一:a|b|c
再来扯一扯vim编辑器中的查找替换用法:
s:用法格式,首先要地址定界s/查找范围,要查找的内容/替换为的内容
要查找的内容:可使用正则表达式
替换为的内容:不支持正则表达式,但支持使用引用前面正则表达式分组中的内容
地址定界:%全文查找,startline,endline,起始结束 也可以这样写/pat1/,/pat2/
先看下sed语法格式
sed [OPTION]... {script-only-if-no-other-script} [input-file]..
选项
-r:支持扩展正则表达式元字符,不加-r就是基本表达式
-n:静默模式
-e:script -e script2 -e 。。。:指定多脚本运行
-f:/path/to/script_file:从指定文件中读取脚本并运行
-i:直接编辑源文件
地址定界:
#: 指定行;
$: 最后一行;
/regexp/:任何能够被regexp所匹配到的行;
\%regexp%:同上,只不过换作%为regexp边界符;
/regexp/| :
\%regexp%| :匹配时忽略字符大小写;
startline,endline:
#,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;
#,#
/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行;
#,+n:从#行开始,一直到向下的n行;
first~step:指定起始行,以及步长;
sed概念:
当启动sed命令后,它会在内容中找一段空间,这段空间是处理sed“输入输出”的的空间,我们可以称他为“工作空间”,它会从源文件中逐行读取到sed的工作空间,(如果没有定界)读取一行内容,而后将结果打印至屏幕,而这个时候sed的这段内存空间叫做sed模式空间
sed基本工作机制:
每次读取一行文件至“模式空间(pattern space)”中,在模式空间中完成处理,不修改源文件,将处理结果输出至标准输出设备
sed编辑命令:
d:删除模式空间中的行
示例:删除/etc/fstab第一行和第二行
[root@node1 clean-simple-white]# sed '1,2d' /etc/fstab
# /etc/fstab
# Created by anaconda on Sat Apr 4 08:45:23 2015
#
# 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=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1
UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2
UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
如果加上-n 那就静默模式你是看不到结果的,并且cat也是看不到结果的
sed -n '1,2d' /etc/fstab
-i -i如果和-n是不能一起使用的
复制一个fstab
[root@node1 clean-simple-white]# cp /etc/fstab /tmp/
修改源文件
[root@node1 clean-simple-white]# sed -i '1,3d' /tmp/fstab
在查看
[root@node1 clean-simple-white]# cat /tmp/fstab
# Created by anaconda on Sat Apr 4 08:45:23 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8)
地址定界:
#:指定行
$:最后一行‘
/regexp/:任何能够被regexp所匹配到的行
\%regexp%:同上,只不过换做%为regexp边界符;
/regexp/|:匹配时忽略字符大小写:\
startlone,endline:
#,/regexp/:这表示从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行
#,#:某行开始某行结束
/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,
#,+n:从#行开始,一直到向下的n行:
first~step:指定起始行,以及步长:
#
示例:
删除所有以#开头的行
[root@node1 clean-simple-white]# sed '/#/d' /tmp/fstab
UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1
UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 defaults 1 2
UUID=7568de25-a229-43cb-952a-ca5fd83bbdcc swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@node1 clean-simple-white]#
=:打印行号
[root@node1 clean-simple-white]# sed '=' /tmp/fstab
1
# Created by anaconda on Sat Apr 4 08:45:23 2015
2
#
3
# Accessible filesystems, by reference, are maintained under '/dev/disk'
4
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
5
#
6
UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1
7
UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default
'/^#/='
只打印#开头的行
[root@node1 clean-simple-white]# sed '=' /tmp/fstab
1
# Created by anaconda on Sat Apr 4 08:45:23 2015
2
#
3
# Accessible filesystems, by reference, are maintained under '/dev/disk'
4
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
5
#
6
UUID=4fb479dc-0364-41ac-a12d-841210d879a4 / ext4 defaults 1 1
7
UUID=30d2724b-a9be-4e32-8b9a-cf731a92173a /boot ext4 default
a:在第三行添加\new mark
1,
sed '1a \new mark' /tmp/fstab
[root@localhost rsyslog-mysql-5.8.10]# sed '3a \new mark' /tmp/fstab
#
# /etc/fstab
new mark
# Created by anaconda on Mon Apr 13 14:19:18 2015
#
# 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
#
/dev/mapper/vg0-root / ext4 defaults 1 1
UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaul
2,
只要是#前都加\new mark
[root@localhost rsyslog-mysql-5.8.10]# sed '/^#/a \new mark' /tmp/fstab
#
new mark
# /etc/fstab
new mark
# Created by anaconda on Mon Apr 13 14:19:18 2015
new mark
#
new mark
# Accessible filesystems, by reference, are maintained under '/dev/disk'
new mark
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
new mark
#
new mark
/dev/mapper/vg0-root / ext4 defaults 1 1
UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults
n:追加
在指定行附加多行:\new mark\nsedond line\nthird
[root@localhost rsyslog-mysql-5.8.10]# sed '1a \new mark\nsedond line\nthird line' /tmp/fstab
new mark
sedond line
third line
#
# /etc/fstab
# Created by anaconda on Mon Apr 13 14:19:18 2015
#
# 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
#
/dev/mapper/vg0-root / ext4 defaults 1 1
UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2
i:插入
同上
-n于p
1,示例:将5和7行打印一份
sed '5,7p' /tmp/fstab
[root@localhost rsyslog-mysql-5.8.10]# sed '5,7p' /tmp/fstab
#
# /etc/fstab
# Created by anaconda on Mon Apr 13 14:19:18 2015
#
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# 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
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
2,示例-n :将5和7行打印一份,其他静默
[root@localhost rsyslog-mysql-5.8.10]# sed -n '5,7p' /tmp/fstab
#
# 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
[root@localhost rsyslog-mysql-5.8.10]#
c:替换指定的行
用指定文本替换
sed -n '5,7c' \new test' \tmp\fstab
示例:
(1) 删除/boot/grub/grub.conf文件中所有行的行首的空白字符;
sed 's/^[[:space:]]\+//' /boot/grub/grub.conf
(2) 删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;
sed 's/^#[[:space:]]\+//' /etc/fstab
(3) 把/etc/fstab文件的奇数行另存为/tmp/fstab.3;
sed '1~2w /tmp/fstab.3' /etc/fstab
(4) echo一个文件路径给sed命令,取出其基名;进一步地,取出其路径名;
取基名:echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@'
取路径名:echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'
sed命令另一个称作"hold space"的内存空间:
这种模式一般不会被使用
高级命令:
h:用模式空间中的内容覆盖保持空间的内容;
H:把模式空间中的内容追加至保持空间中内容的后面;
g:从保持空间中取到其内容,并将其覆盖模式空间中的内容;
G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面;
x:把保持空间和模式空间中的进行交换;
n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容);
N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面;
d:删除模式空间中的内容;
D:删除多行模式空间中的首行;
注意:命令功能可使用!取反;分号可用于分隔脚本
示例:
sed 'G' /etc/issue: 在文件中的每行后方添加空白行;
[root@www ~]# sed 'G' /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
LinuxEA Education Learning Services
http://www.linuxea.com
[root@www ~]# cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
LinuxEA Education Learning Services
http://www.linuxea.com
[root@www ~]#
sed '$!d' /etc/fstab:保留最后一行;
[root@www ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Apr 13 14:19:18 2015
#
# 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
#
/dev/mapper/vg0-root / ext4 defaults 1 1
UUID=90679dfa-480a-47fd-be39-e243d7a73a78 /boot ext4 defaults 1 2
/dev/mapper/vg0-usr /usr ext4 defaults 1 2
/dev/mapper/vg0-var /var ext4 defaults 1 2
/dev/mapper/vg0-swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
172.16.249.249:/shared/nfs/ /mnt ext4 defaults 0 0
[root@www ~]#
sed '/^$/d;G' /etc/issue: 保证指定的文件每一行后方有且只有一个空白行;
[root@www ~]# sed '/^$/d;G' /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
LinuxEA Education Learning Services
http://www.linuxea.com
[root@www ~]# tail /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
LinuxEA Education Learning Services
http://www.linuxea.com
[root@www ~]#
sed 'n;d' /etc/issue:保留奇数行;
[root@www ~]# sed 'n;d' /etc/issue
CentOS release 6.6 (Final)
http://www.linuxea.com
[root@www ~]#
[root@www ~]# tail /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
LinuxEA Education Learning Services
http://www.linuxea.com
sed -n '1!G;h;$p' /etc/issue;反转整个文件
[root@www ~]# sed -n '1!G;h;$p' /etc/issue
http://www.linuxea.com
LinuxEA Education Learning Services
Kernel \r on an \m
CentOS release 6.6 (Final)
sed '$!N;$!D' /etc/issue:显示最后两行
[root@www ~]# sed '$!N;$!D' /etc/issue
http://www.linuxea.com
[root@www ~]#
也可以直接:tail -2
[root@www ~]# tail -2 /etc/issue
http://www.linuxea.com
[root@www ~]#
哈哈,这篇文字不要太水啊。