shell编程之sed
sed
是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed
命令处理缓冲区中的内容,处理完成 后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。
sed基本语法
sed OPTIONS… [SCRIPT] [INPUTFILE…]
常用的选项:-n , --quiet , --silent :不输出模式空间中的内容,使用安静模式,在一般 sed 的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行才会被列出来;-i :直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作;-e :直接在命令行模式上进行 sed 的动作编辑,多个子命令之间也可以用分号隔开; sed - e'command1 ; command2...' filename 或者 sed - e 'command1' - e 'command2' ……filename-r :使用扩展正则表达式;-f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作。
模拟空间的编辑操作
地址定界
练习题grep及sed
grep "bash$" /etc/passwd
grep -E"[0-9]{3,4}" /etc/passwd
grep -E"^\s+.+" /etc/grub2.cfg
netstat -tan grep -E "LISTEN\S*$
fdisk -lgrep -E '/dev/(sd hd)[a-2]
ldd /usr/bin/cat grep -o "/.*/.*\s"
echo /root/ce/lk.txt | grep -oE '/[^/]+' | sed -nr '3 s%/([^/]+)%\1% p'
grep -E "^(.+):.*\1$" /etc/passwd
14.
grep '#[[:space:]]\{1,\}[^[:space:]]' /etc/fstab
15.
grep '\<to.*to\>' /etc/rc.d/rc.local
sed -n '/to.*to/ p' /etc/rc.d/rc.local
16.
grep '\bs.*d\b' /etc/inittab
17.
ifconfig | grep -oE '([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
18.
grep -E 'Failed|FAILED' /var/log/secure
awk '/(Failed|FAILED)/ {print $0}' /var/log/secure
sed -n '/(Failed|FAILED)/p' /var/log/secure
19.
grep 'bash$' /etc/passwd
1.
vim /root/test.txt
sed -p /root/test.txt
2.
sed -n '3~10 p' /root/test.txt
awk 'NR>=3&&NR<=10 {print $0}' /root/test.txt
3.
sed -n '/root/p' /root/test.txt
4.
sed -n '15~$ d' /root/test.txt
5.
sed '/bash/d' /root/test.txt
6.
sed -n 's/root/toor/gp' /root/test.txt
7.
sed -n's@/sbin/nologin@/bim/login@g' /root/test.txt
8.
sed -n '5,10 s/[0-9]//gp' /root/test.txt
9.
sed -n 's/[^a-zA-Z0-9]//gp' /root/test.txt
10.
sed '20,$s/^.*$/aaa:&/g' test.txt
11、复制/etc/grub2.cfg到/root/grub2.cfg,删除文件中所有以空白开头的行行首的空白字符;
[root@localhost ~]# sed 's/^[[:space:]]//' grub2.cfg
12、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@localhost ~]# sed 's/^#[[:space:]]*//' /etc/fstab
13、给文件/root/anaconda-ks.cfg每一行行首增加#号
[root@localhost ~]# sed 's/^.*$/#&/' /root/anaconda-ks.cfg
14、在/etc/fstab文件中不以#开头的行的行首增加#号;
[root@localhost ~]# sed 's/^[^#]/#&/' /etc/fstab
15、处理/etc/sysconfig/network-scripts/路径,使用grep和sed命令取出其目录名和基名
[root@localhost ~]# echo "/etc/sysconfig/network-scripts/" |sed -r
's#^/(.*)/(.*)/#\1#' etc/sysconfig
[root@localhost ~]# echo "/etc/sysconfig/network-scripts/" |sed -r
's#^/(.*)/(.*)/#\2#'
network-scripts
[root@localhost ~]# echo "/etc/httpd/conf.d/host.conf" | sed -r 's#(^/.*/)[^/].*#\1#'
/etc/httpd/conf.d/
[root@localhost ~]# echo "/etc/httpd/conf.d/host.conf" | sed -r
's#^/.*/([^/].*)#\1#'
host.conf
[root@localhost ~]# basename /etc/httpd/conf.d/host.conf
host.conf
[root@localhost ~]# dirname /etc/httpd/conf.d/host.conf
/etc/httpd/conf.d
[root@localhost ~]# echo "/etc/sysconfig/network-scripts/"|grep -o -E "
[^/]+/?
$"|grep -o -E "^[^/]+"
network-scripts
[root@localhost ~]# echo "/etc/sysconfig/network-scripts/"|grep -o -E "
(^/([^/]+/)*[^[:space:]])|^/"|grep -o -E "^/([^/]+/)*"|grep -o -E "
(/[^/]+)+|^/"
/etc/sysconfig
16、利用sed 取出ifconfig命令中本机的IPv4地址
[root@localhost ~]# ifconfig |sed -n '2p' | sed -r "s/.*inet[[:space:]]*//"
|
sed -r "s/[[:space:]]*netmask.*//"
192.168.168.128
17、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
[root@localhost ~]# ls /mnt/Packages/|grep "rpm$"|sed -r 's@.*\.
(.*)\.rpm@\1@'|sort|uniq -c
1085 i686
1216 noarch
2319 x86_64
1.
sed -i 's/^[[:space:]]\+//' /etc/grub2.conf
2.
sed -i 's/^#[[:space:]]\+//' /etc/fstab
3.
sed -i 's/^/#/' /root/install.log
4.
sed -i '/^[^#]/s/^/#/' /etc/fstab
5.
ifconfig | sed -n '/inet /{s/^.*inet \(.*\)
netmask.*/\1/p}'
6.
- 临时关闭(重启后失效):setenforce 0
- 永久关闭(需要修改配置文件):编辑 /etc/selinux/
config 文件,将 SELINUX=enforcing 或 SELINUX=
permissive 修改为 SELINUX=disabled 。
7.
vi /etc/hosts