实战:expect实现无交互登录
正则表达式
sed
expect使用
expect 是用来进行自动化控制和测试的工具。主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。对于大规模的linux 运维很有帮助。expect sourceforge
TCL(Toolcommand language)是一种类似shell脚本的语言,你可以使用它来完成许多操作。expect是从它发展出来的。如果你想要写一个能够自动处理输入输出的脚本(如向用户提问并且验证密码)又不想面对C或者Perl,那么expect是你的最好的选择
expect是在tcl基础上创建起来的,它还提供了一些tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作
1.安装expect安装包
[root@CentOS6-node1~]# yum -y install expect
#我使用的是网络yum源
Loaded plugins: fastestmirror, refresh-packagekit,security
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package expect.x86_64 0:5.44.1.15-5.el6_4 willbe installed
Installed:
expect.x86_640:5.44.1.15-5.el6_4
Complete!
[root@CentOS6-node1 ~]#
expect各项参数
使用expect创建脚本的方法
#!/usr/bin/expect
#这里定义的是expect可执行文件的链接路径(或真实路径),功能类似于bash等shell功能
set timeout 30
set timeout 30
#设置超时时间,单位是秒,如果设为timeout -1 意为永不超时
spawn
spawn
#spawn 是进入expect环境后才能执行的内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。不能直接在默认的shell环境中进行执行主要功能,它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
expect
expect
#这里的expect同样是expect的内部命令
#主要功能:判断输出结果是否包含某项字符串,没有则立即返回,否则就等待一段时间后返回,等待时间通过timeout进行设置
send
send
#执行交互动作,将交互要执行的动作进行输入给交互指令
#命令字符串结尾要加上"\r",如果出现异常等待的状态可以进行核查
exp_continue
exp_continue
#继续执行接下来的交互操作
interact
interact
#执行完后保持交互状态,把控制权交给控制台;如果不加这一项,交互完成会自动退出
$argv
$argv
#expect 脚本可以接受从bash传递过来的参数,可以使用 [lindex$argv n]获得,n从0开始,分别表示第一个,第二个,第三个……参数
例子一:免密码通过SSH登录服务器
实验需求:
需要准备两台centos6.5 的操作系统
centos 6.5-1 IP地址:192.168.100.131
centos 6.5-2 IP地址:192.168.100.129
#!/usr/bin/expect
set ipaddress "192.168.100.129" #设置远程连接地址
set name root #设置远程登录的用户名
set passwd "linuxtouch" #设置远程登录的密码
set timeout 30 #设置超时时间为30秒
spawn ssh $name@$ipaddress #spawn是一个SSH登录进程
expect { #等待响应,根据提示进行判断
"yes/no" { send "yes\r";exp_continue }
#注意左大括号前空格的问题 #\r代表回车 #exp_continue代表继续执行
"password" { send "$passwd\r"; } #\r代表回车
}
interact #登录到远程服务器不退出
~
#或者使用此命令执行
[root@CentOS6-node1 ~]# expect sshd.exp
spawn ssh root@192.168.100.129
root@192.168.100.129‘s password:
Last login: Wed Jul 12 19:46:39 2017 from192.168.100.131
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# ./sshd.exp
-bash: ./sshd.exp: 权限不够
[root@CentOS6-node1 ~]# chmod +x sshd.exp
[root@CentOS6-node1 ~]# ll !$
ll sshd.exp
-rwxr-xr-x. 1 root root 272 7月 12 18:03 sshd.exp
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# ./sshd.exp
spawn ssh root@192.168.100.129
root@192.168.100.129‘s password:
Last login: Wed Jul 12 18:18:34 2017 from192.168.100.131
[root@CentOS6-node1 ~]# ifconfig
eth2 Linkencap:Ethernet HWaddr00:0C:29:28:71:FE
#inetaddr:192.168.100.129 Bcast:192.168.100.255 Mask:255.255.255.0
inet6addr: fe80::20c:29ff:fe28:71fe/64 Scope:Link
UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RXpackets:13628 errors:0 dropped:0 overruns:0 frame:0
TXpackets:6867 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RXbytes:19004274 (18.1 MiB) TXbytes:417128 (407.3 KiB)
lo Linkencap:Local Loopback
inetaddr:127.0.0.1 Mask:255.0.0.0
inet6addr: ::1/128 Scope:Host
UPLOOPBACK RUNNING MTU:16436 Metric:1
RXpackets:16 errors:0 dropped:0 overruns:0 frame:0
TXpackets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RXbytes:960 (960.0 b) TX bytes:960 (960.0b)
[root@CentOS6-node1 ~]#
例子二:实现通过SSH自动登录对服务器进行批量管理
1.写一个ssh自动登录脚本
例子:
set ip [lindex $argv 0] #引用第一个常量 set password [lindex $argv 1] #引用第二个常量
执行时输入如下:
expect a.exp 192.168.100.110 #相当于argv0量 linuxtouch#相当于argv1
[root@CentOS6-node1~]# cat a.exp
#!/usr/bin/expect
set ip [lindex $argv 0] #引用第一个常量
set password [lindex $argv 1] #引用第二个常量
set timeout -1
spawn ssh root@$ip
expect {
"password" { send "$password\r"; }
"yes/no" { send "yes\r";exp_continue }
}
expect "#" #[root@CentOS6-node1~]#
send "mkdir -p /linux/touch\r"
send "pwd\r"
send "exit\r"
expect eof #结束此进程
#或者换成下面的也可以
expect "#"
send "mkdir -p /linux/touch\r"
expect "#"
send "exit\r"
expect eof
2.准备一个文件用来存放ip地址和密码
[root@CentOS6-node1~]# cat passwd.txt
192.168.100.129 linuxtouch
192.168.100.130 linuxtouch123
[root@CentOS6-node1 ~]#
3.直接测试,脚本目前还没有写好写好后挥发另外一篇帖子
[root@CentOS6-node1~]# cat passwd.txt | grep 192.168.100.129 | xargs ./a.exp
spawn ssh root@192.168.100.129
root@192.168.100.129‘s password:
Last login: Wed Jul 12 23:33:21 2017 from192.168.100.131
[root@CentOS6-node1 ~]# mkdir -p /linux/touch
[root@CentOS6-node1 ~]# exit
logout
Connection to 192.168.100.129 closed.
[root@CentOS6-node1 ~]# cat passwd.txt | grep 192.168.100.130 | xargs ./a.exp
spawn ssh root@192.168.100.130
root@192.168.100.130‘s password:
Last login: Wed Jul 12 18:35:49 2017 from192.168.100.1
[root@CentOS6-node1 ~]# mkdir -p /linux/touch
[root@CentOS6-node1 ~]# exit
logout
Connection to 192.168.100.130 closed.
[root@CentOS6-node1 ~]#
查看192.168.100.129是否创建/linux/touch目录
[root@CentOS6-node1 ~]# cd /linux/touch/
[root@CentOS6-node1 touch]# pwd #创建成功
/linux/touch
[root@CentOS6-node1 touch]#
[root@CentOS6-node1 touch]# ifconfig | grep addr
eth2 Linkencap:Ethernet HWaddr00:0C:29:28:71:FE
inetaddr:192.168.100.129 Bcast:192.168.100.255 Mask:255.255.255.0
inet6addr: fe80::20c:29ff:fe28:71fe/64 Scope:Link
inetaddr:127.0.0.1 Mask:255.0.0.0
inet6addr: ::1/128 Scope:Host
[root@CentOS6-node1 touch]#
查看192.168.100.130是否创建/linux/touch目录
[root@CentOS6-node1 ~]# cd /linux/touch/
[root@CentOS6-node1 touch]# pwd #创建成功
/linux/touch
[root@CentOS6-node1 touch]# ifconfig | grep add
eth2 Linkencap:Ethernet HWaddr00:0C:29:F4:08:A6
inetaddr:192.168.100.130 Bcast:192.168.100.255 Mask:255.255.255.0
inet6addr: fe80::20c:29ff:fef4:8a6/64 Scope:Link
inetaddr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
[root@CentOS6-node1 touch]#
正则表达式的使用
概念:
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。
用某种模式去匹配一类字符串。
shell元字符(也叫通配符):由shell来解析,如rm –rf *.txt,元字符* shell把它解析为任意多个字符
正则表达式元字符:由各种执行模式匹配操作的程序来解析,比如:vi、grep、sed、awk、python
正则表达式的基本组成部分http://man.linuxde.net/docs/shell_regex.html
元字符 | 功能 | 示例 |
\< | 词首定位符 | \<love |
\> | 词尾定位符 | love\> |
\(..\) | 标签匹配 | :%s/(192.168)/\1.10./g :%s/(192.168)/#\1/g |
grep使用的元字符
grep:使用基本元字符集 ^ $* [] [^] \< \> \( \) \{\ }
egrep:使用扩展元字符 ? + { } | ( )
注:grep也可以使用扩展字符集,仅需要对这些字符前加转义符 \
\w 所有字母与数字,如[a-zA-Z0-9]ve也可以写成 \w*ve
\b 单词边界如 \ 写成\blove\b
sed的使用
sed(strem editor) 流编辑器
概念:
sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
sed也是支持正则表达式的,如果要使用扩展正则加参数-r
语法格式:
sed [options] ‘[command]’ filename
参数:
options:
-n抑制自动(默认的) 输出 *** 读取下一个输入行
-e执行多个sed指令
-f运行脚本
-i 编辑文件内容 ***
-i.bak 编辑的同时创造.bak的备份
-r 使用扩展的正则表达式
command:
a\在当前行下面插入文件
i\在当前行上面插入文件
c\把选定的行改为新的指定的文本
p 打印***
d 删除***
r/R 读取文件/一行
w 另存
s 查找
y 替换
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
D 删除\n之前的内容
P 打印\n之前的内容
实例一:将每行root替换成awk,但是只是每行的第一个root被替换
[root@CentOS6-node1~]# sed ‘s/root/awk/‘ a.txt | grep root
awk:x:0:0:root:/root:/bin/bash
ASDF:awk:asdfas:root
[root@CentOS6-node1 ~]#
实例二:将a.txt文件中的所有root字符全部替换成awk
[root@CentOS6-node1~]# sed ‘s/root/awk/g‘ a.txt | grep root
#通过grep过滤出root的行,但是没有,说明成功
[root@CentOS6-node1 ~]# sed ‘s/root/awk/g‘ a.txt| grep awk
awk:x:0:0:awk:/awk:/bin/bash
operator:x:11:0:operator:/awk:/sbin/nologin
ASDF:awk:asdfas:awk
[root@CentOS6-node1 ~]#
注意:s/../../是分隔符,分割符 "/" 可以用别的符号代替 , 比如 “,” “|” “_“等 .
实例三:将a.txt文本中的/sbin/nologin 替换为 /sbin/hehehe
[root@CentOS6-node1~]# sed ‘s_/sbin/nologin_/sbin/hehehe_g‘ a.txt | head -10
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/hehehe
daemon:x:2:2:daemon:/sbin:/sbin/hehehe
adm:x:3:4:adm:/var/adm:/sbin/hehehe
lp:x:4:7:lp:/var/spool/lpd:/sbin/hehehe
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/hehehe
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/hehehe
[root@CentOS6-node1 ~]#
此时的‘_’分隔符是不是比‘/’分隔符更好用一点
另外:[root@pandaopt]# sed ‘#root#cAWK‘ a.txt
#直接进行匹配处理,在特殊符号前加斜线声明一下。如果是查找替换则不用
实例四:用&表示前面匹配的字符串整个文件
[root@CentOS6-node1~]# sed ‘s/awk/(&)/g‘ a.txt | head -10
(awk):x:0:0:(awk):/(awk):/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@CentOS6-node1 ~]#
实例五:将a.txt文件中的第一行删除,将第二行的sbin替换为****,查看前5行
注释:
-e:同时替换多项内容-e进行多个字符的匹配
[root@CentOS6-node1~]# sed -e ‘1d‘ -e ‘2s/sbin/*****/‘ a.txt | head -5
bin:x:1:1:bin:/bin:/*****/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@CentOS6-node1 ~]#
实例六:进行三次替换,将awk替换为&,将daemon替换为@,将x替换为****** 全部替换,只显示文本中前10行
#原文本内容
[root@CentOS6-node1 ~]# cat a.txt | head -10
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# sed‘s/awk/\&/g;s/daemon/\@/g;s/x/\*****/g‘ a.txt | head -10
&:*****:0:0:&:/&:/bin/bash
bin:*****:1:1:bin:/bin:/sbin/nologin
@:*****:2:2:@:/sbin:/sbin/nologin
adm:*****:3:4:adm:/var/adm:/sbin/nologin
lp:*****:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:*****:5:0:sync:/sbin:/bin/sync
shutdown:*****:6:0:shutdown:/sbin:/sbin/shutdown
halt:*****:7:0:halt:/sbin:/sbin/halt
mail:*****:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:*****:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@CentOS6-node1 ~]#
实例七:将第三行的nologin替换为bash并且将第四行的adm替换为两个$$显示前5行
#原文本内容
[root@CentOS6-node1 ~]# cat a.txt | head -5
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# sed -e‘3s/nologin/bash/;4s/adm/\$\$/g‘ a.txt |head -5
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/bash
$$:x:3:4:$$:/var/$$:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@CentOS6-node1 ~]#
实例八:显示文件的第三行内容
[root@CentOS6-node1~]# sed -n ‘3p‘ a.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CentOS6-node1 ~]# cat a.txt | head -5
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@CentOS6-node1 ~]#
实例九:将全文中的所有awk字符替换为hehehehehe并打印出来
#未更改之前的文本内容
[root@CentOS6-node1 ~]# cat a.txt | grep awk
awk:x:0:0:awk:/awk:/bin/bash
operator:x:11:0:operator:/awk:/sbin/nologin
ASDF:awk:asdfas:awk
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# sed -n ‘s/awk/hehehehehe/gp‘a.txt
hehehehehe:x:0:0:hehehehehe:/hehehehehe:/bin/bash
operator:x:11:0:operator:/hehehehehe:/sbin/nologin
ASDF:hehehehehe:asdfas:hehehehehe
[root@CentOS6-node1 ~]#
实例10:将/var/log/messages 中开头是Jul 13字符的打印出来只打印第1行到第5行
[root@CentOS6-node1~]# grep "Jul 13" /var/log/messages | wc -l
1417
[root@CentOS6-node1 ~]# sed -n ‘/^Jul 13/ p‘ /var/log/messages | sed -n 1,5p
Jul 13 14:27:06 CentOS6-node1 kernel: imklog 5.8.10,log source = /proc/kmsg started.
Jul 13 14:27:06 CentOS6-node1 rsyslogd: [originsoftware="rsyslogd" swVersion="5.8.10"x-pid="1562" x-info="http://www.rsyslog.com"] start
Jul 13 14:27:06 CentOS6-node1 kernel: Initializingcgroup subsys cpuset
Jul 13 14:27:06 CentOS6-node1 kernel: Initializingcgroup subsys cpu
Jul 13 14:27:06 CentOS6-node1 kernel: Linux version2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.720120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013
[root@CentOS6-node1 ~]#
实例11:显示a.txt文本中的2-3行的内容
[root@CentOS6-node1~]# sed -n ‘2,3p‘ a.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CentOS6-node1 ~]#
实例12:显示第一行和第三行内容
nl:查看文本内容并以行号显示出
[root@CentOS6-node1~]# nl a.txt | sed -n -e ‘1p;3p‘
1 awk:x:0:0:awk:/awk:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CentOS6-node1 ~]#
实例13:显示文件中除前3行的内容
[root@CentOS6-node1~]# nl a.txt | sed -n -e ‘1,3!p‘ | head -10
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 operator:x:11:0:operator:/awk:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin
13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
[root@CentOS6-node1 ~]#
实例14:显示文件中第三行和之后的三行
[root@CentOS6-node1~]# nl a.txt | sed -n ‘3,+3p‘
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@CentOS6-node1 ~]#
实例15:在文件头插入“###”
[root@CentOS6-node1~]# sed -i ‘1i###‘ a.txt
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# cat !$ | head -5
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@CentOS6-node1 ~]#
实例16:在文件尾部插入“@@@”
[root@CentOS6-node1~]# sed ‘$a@@@‘ a.txt
.........
oprofile:x:16:16:Special user account to be used byOProfile:/home/oprofile:/sbin/nologin
ASDF:awk:asdfas:awk
/bin/bash asdfasjdfqwerp
@@@
[root@CentOS6-node1 ~]#
实例17:在文件第二行后插入两行内容
[root@CentOS6-node1~]# sed ‘2a hello \
> afdw‘ a.txt
###
awk:x:0:0:awk:/awk:/bin/bash
hello
afdw
bin:x:1:1:bin:/bin:/sbin/nologin
实例18:把文件第三行替换为“$$$”
[root@CentOS6-node1~]# sed ‘3c$$$‘ a.txt
###
awk:x:0:0:awk:/awk:/bin/bash
$$$
daemon:x:2:2:daemon:/sbin:/sbin/nologin
实例19:把文件中以SELINUX开头的行替换为SELINUX=disabled
[root@CentOS6-node1~]# sed ‘/^SELINUX=/cSELINUX=disabled‘ /etc/selinux/config
# This file controls the state of SELinux on thesystem.
# SELINUX= can take one of these three values:
# enforcing- SELinux security policy is enforced.
# permissive- SELinux prints warnings instead of enforcing.
# disabled -No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted -Targeted processes are protected,
# mls -Multi Level Security protection.
SELINUXTYPE=targeted
[root@CentOS6-node1 ~]#
实例20:将2到4行复制到尾行
[root@CentOS6-node1~]# sed ‘2,4H;$G‘ a.txt > qwer.txt
[root@CentOS6-node1 ~]# cat !$
cat qwer.txt
.........
/bin/bash asdfasjdfqwerp
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CentOS6-node1 ~]#
实例21:将第一行复制到第6行后面
[root@CentOS6-node1~]# sed ‘1,3H;6G‘ a.txt > qwer.txt
[root@CentOS6-node1 ~]# cat !$
cat qwer.txt
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
实例22:将第8行内容替换为第2行的内容,有下面两种写法
#第一种
[root@CentOS6-node1 ~]# sed ‘2h;/shutdown/g‘ a.txt
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
awk:x:0:0:awk:/awk:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
#第二种
[root@CentOS6-node1 ~]# sed ‘2h;8g‘ a.txt
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
awk:x:0:0:awk:/awk:/bin/bash
halt:x:7:0:halt:/sbin:/sbin/halt
实例23:删除文本中的所有空行
[root@CentOS6-node1~]# cat a.txt | tail -10
asdfasdf
werqwer
asdf
asd
f
asdf
qwere
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# sed ‘/^$/d‘ a.txt
............
ASDF:awk:asdfas:awk
/bin/bash asdfasjdfqwerp
asd
asdfasdf
werqwer
asdf
asd
f
asdf
qwere
[root@CentOS6-node1 ~]#
实例24:备份,把原文件备份后,在进行修改原文件
[root@CentOS6-node1~]# sed -i.bak ‘1c************‘ a.txt
[root@CentOS6-node1 ~]# ls
abc #a.txt.bak
a.exp b.txt passwd.txt 视频
anaconda-ks.cfg install.log qwer.txt 图片
apache-tomcat-7.0.77 install.log.syslog sshd.exp 文档
apache-tomcat-7.0.77.tar.gz ip.log sshd.exp.bak 下载
a.sh jdk-7u80-linux-x64.tar.gz vmware-tools-distrib 音乐
a.txt login.sh 公共的 桌面
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# cat a.txt
************
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@CentOS6-node1 ~]# cat a.txt.bak
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
实例25:删除文件中空行和#号开头的行
[root@CentOS6-node1~]# sed ‘/^#\|^$/d‘ abc |wc -l
13
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# grep -v ‘^#\|^$‘ abc | wc -l
13
[root@CentOS6-node1 ~]#
[root@CentOS6-node1 ~]# cat abc
Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATELC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONELC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem sftp /usr/libexec/openssh/sftp-server
[root@CentOS6-node1 ~]#
[root@panda opt]#for i in {1..100};do echo "$i ${i}0 ${i}00" >> a.txt;done
[root@panda opt]# sed -n ‘/10/p‘ a.txt ----这个是 / /匹配模式
1 10 100
10 100 1000
11 110 1100
21 210 2100
31 310 3100
41 410 4100
51 510 5100
61 610 6100
71 710 7100
81 810 8100
91 910 9100
100 1000 10000
[root@panda opt]# sed -n ‘/10/s/10/A/p‘ a.txt 查找10并对找到的10进行替换
A0 1000 10000
1 A 100
A 100 1000
11 1A 1100
21 2A 2100
31 3A 3100
41 4A 4100
51 5A 5100
61 6A 6100
71 7A 7100
81 8A 8100
91 9A 9100
A0 1000 10000
[root@panda opt]# sed ‘4,6d‘ a.txt --删除第4到6行
4 40 400
5 50 500
6 60 600
7 70 700
8 80 800
9 90 900
10 100 1000
11 110 1100
12 120 1200
13 130 1300
14 140 1400
15 150 1500
[root@panda opt]# sed ‘1~3d‘ a.txt ---第1行开始每3行删除一行
2 20 200
3 30 300
5 50 500
6 60 600
8 80 800
9 90 900
11 110 1100
12 120 1200
14 140 1400
15 150 1500
1. #!/usr/bin/expect
2. #远程主机信息配置
3. setsftp_host 11.11111.111.1
4. setsftp_port 22
5. setsftp_user aaa
6. setsftp_password xxx
7. setsftp_remote_dir /
8.
9. #本地信息配置
10. setlocal_dir /brcb_edp/TMPDATA/awk/shengji
11. settimeout -1
12.
13. #sftp putfile to remote server
14. spawn sftp -oport=$sftp_port $sftp_user@$sftp_host
15. expect"*assword*"
16. send"$sftp_password\r"
17. send"lcd $local_dir\r" 切换本地目录
18. expect"sftp>"
19. send "cd$sftp_remotet_dir\r" 切换远程服务器目录
20. expect"sftp>"
21. send"put HD_COBS2014.txt\r" put上传:把本地内容上传到远程服务器 get 下载:从远程服务器下载东西到本地
22. expect"sftp>"
23. send"quit\r"
24. expect eof
本文出自 “linuxtouch” 博客,请务必保留此出处http://linuxtouch.blog.51cto.com/12429083/1947301
原文地址:http://linuxtouch.blog.51cto.com/12429083/1947301