3)、sed篇
3.1)sed基础
p 打印匹配行
= 打印文件行号
a\ 在指定的文件后追加文本 例如:sed '/root/a\hello' passwd
i\ 在定位行号之前插入内容信息(insert)
d 删除文本
-i.bak 源文件自动备份为“源文件名.bak”
c\ 用新文本替换匹配的行 eg sed '/nologin/c\hello' /etc/passwd #以nologin的行替换为hello
n或--quiet #安装模式
e #多个模式同时匹配 例如: sed -n -e '/root/p' -e '/root/=' /etc/passwd
$ #在正则表达式中表示行尾,在sed中表示最后一行 例如:sed -n '$p' passwd
! #表示取反 例如: sed -n '1,10!p' passwd #打印非1-10行
/pattern/,x 和 x,/pattern/ #定义行号与关键字匹配行之间的范围 例如:sed -n '/root/,$p' passwd #匹配/root/到最后一行内容
r 从一个文件中读文件
w 将文本写入到一个文件
[root@localhost home]# aa="(:0.0)"
[root@localhost home]# echo $aa | sed -e 's/[()]//g'
:0.0
[root@class14 ~]# sed -n '1p' /etc/passwd #加了-n选项不打印所有行
root:x:0:0:root:/root:/bin/bash
[root@class14 ~]# sed -n '1,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@class14 ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@class14 ~]# sed -n '/root/=' /etc/passwd #打印匹配行的行号
1
11
[root@class14 ~]# sed -n -e '/root/=' -e '/root/p' /etc/passwd
1
root:x:0:0:root:/root:/bin/bash
11
operator:x:11:0:operator:/root:/sbin/nologin
sed带多个编辑命令需要携带-e选项
sed [选项] -e 编辑命令1 -e 编辑命令2 -e 编辑命令3 输入文件
[root@class14 ~]# sed -n '$p' pass #打印最后一行
adm:x:3:4:adm:/var/adm:/sbin/nologin
sed '1,10d' pass #删除pass文件中的1-10行
@@@@@@@@@@@@
-n 与 -p 相结合使用只打印匹配行
@@@@@@@@@@@@
[root@class16 ~]# sed -n 's/root/JACK/gp' passwd
JACK:x:0:0:JACK:/JACK:/bin/bash
[root@class16 ~]#
++++++++++++++++++++++++++++++++++++++++++++++++++++++
[root@class16 ~]# sed -n 's/root/ROOT/gw aab' passwd
[root@class16 ~]# more aab
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
[root@class16 ~]#
++++++++++++++++++++++++++++++++++++++++++++++++++
&符号可用来保存被替换的字符串以供调用.
sed -n 's/root/(&)/pg' pass
sed -n 's/root/(root)/pg' pass
[root@class16 ~]# sed -n 's/root/(&)/pg' passwd
(root):x:0:0:(root):/(root):/bin/bash
[root@class16 ~]#
[root@class16 ~]#
[root@class16 ~]# sed -n 's/root/(root)/pg' passwd
(root):x:0:0:(root):/(root):/bin/bash
##################################################
利用sed写入到一个新文件
sed -n '1,5 w /root/ab' /etc/passwd #将/etc/passwd前5行写入到/root/ab
sed '/root/r ab' passwd #将ab文件读入到passwd的root行前.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
sed -n -e '/root/p' -e '/root/=' /etc/passwd
等价于
sed -n '/root/{p;=}' /etc/passwd
等价于
sed -n '/root/p;/root/=' /etc/passwd
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
处理匹配行的下一行:
sed '/root/{n;s/x/jack/;}' /etc/passwd
sed缓冲区的处理:
sed -e '/root/h' -e '/root/x' -e '$G' /etc/passwd
h和H: 模式缓冲区内容替换保持缓冲区内容,
h是将保持缓冲区的旧内容覆盖掉副本,
H是追加,在保持缓冲区旧内容上增加新内容
g和G: 保持缓冲区内容替换模式缓冲区内容,G是追加,
g是副本
###########################################
如何在shell下切换用户执行命令?
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
su - dev -c "ls"
?
"su -"切换用户,并且当前目录页切换到相应用户的根目录。
"dev"是用户名
"-c"后面接需要执行的shell comman
例如:
su - oracle -c "cat >>/etc/profile<<!export ORACLE_HOME=/u01/app/oracle!"
+++++++++++++++++++++++++++++++++++++++++
sed利用变量上下文
案例一:匹配含有listen的行
#!/bin/bash
aa=listen
sed -n '/'"$aa"'/p' /root/named.conf
使用变量只用加上一个双引号就行.
sed -i.bak '8 s/@/'"$aa"'/g'
例如:
sed -i.bak '/root/p' passwd #将源文件重命名为.bak文件结尾,生成一个以源文件命名的文件
sed '36 r a.txt' named.conf #在36行插入文本a.txt内容
sed -n 's/root/ROOT/p' /etc/passwd #将root替换为ROOT并且显示到屏幕
cat passwd
aaaaaaJACKccccccddddee
aa = 5
sdgalgdl
bb = 6
将空格使用[[:spance:]]来代替
sed -i "s#aa[[:space:]]=[[:space:]]5#abc = 50#g" passwd
zoer@ubuntu:~$ cat data
here is a
test naughty loves cc
and so on....
zoer@ubuntu:~$ cat dd
testline1
testline2
zoer@ubuntu:~$ sed '/naughty/r dd' data
here is a
test naughty loves cc
testline1
testline2
and so on....
上面的命令匹配naughty这个单词并且在该行的下一行开始插入dd文件的内容。
3.2)sed变量
1、sed命令使用双引号的情况下,可以使用$var(变量)直接引用:
echo | sed "s/^/$RANDOM.rmvb_/g"
13562.rmvb_
2、sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量):
echo | sed 's/^/'"$RANDOM"'.rmvb_/g'
2442.rmvb_
3、sed中执行外部命令。
sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果:
echo | sed 's/^/'`echo $RANDOM`'.rmvb_/g'
7700.rmvb_# 结果
# 上面的命令使用了旧式的命令替换,也可以采用新式的命令替换方法,如下:
echo | sed 's/^/'$(echo $RANDOM)'.rmvb_/g'
13856.rmvb_# 结果
# 下面例子取用当前日期作为结果的一部分,如下:
echo | sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'
20130401.rmvb_ # 结果
2、sed命令中使用双引号的情况下,直接`shell command`或者$(shell command)引用命令执行。
echo | sed "s/^/$(date +"%Y%m%d").rmvb_/g"
20130401.rmvb_# 结果
# 使用环境变量$RANDOM以及旧式命令替换的例子:
echo | sed "s/^/`echo $RANDOM`.rmvb_/g"
29484.rmvb_# 结果