《1-23-expect、正则表达式和sed的使用.docx》由会员分享,可在线阅读,更多相关《1-23-expect、正则表达式和sed的使用.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1-23-expect、正则表达式和sed的使用本节所讲内容:q 实战:expect实现无交互登录q 正则表达式q sed第1章 expect使用TCL(Tool command language)是一种类似shell脚本的语言,你可以使用它来完成许多操作。expect是从它发展出来的。如果你想要写一个能够自动处理输入输出的脚本(如向用户提问并且验证密码)又不想面对C或者Perl,那么expect是你的最好的选择expect是在tcl基础上创建起来的,它还提供了一些tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作1.1 安装expectrootxuegod67 mnt
2、# yum -y install expectLoaded plugins: product-id, refresh-packagekit, security, subscription-managerThis system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.base | 3.9 kB 00:00 . Setting up Install ProcessResolving Dependencies- Running transact
3、ion check- Package expect.x86_64 0:5.44.1.15-5.el6_4 will be installed- Processing Dependency: libtcl8.5.so()(64bit) for package: expect-5.44.1.15-5.el6_4.x86_64- Running transaction check- Package tcl.x86_64 1:8.5.7-6.el6 will be installed- Finished Dependency ResolutionInstalled: expect.x86_64 0:5
4、.44.1.15-5.el6_4 Dependency Installed: tcl.x86_64 1:8.5.7-6.el6 1.2 使用expect使用expect创建脚本的方法1)定义脚本执行的shell#!/usr/bin/expect这里定义的是expect可执行文件的链接路径(或真实路径),功能类似于bash等shell功能2)set timeout 30设置超时时间,单位是秒,如果设为timeout -1 意为永不超时3)spawn spawn 是进入expect环境后才能执行的内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。不能直接在默
5、认的shell环境中进行执行主要功能,它主要的功能是给ssh运行进程加个壳,用来传递交互指令。4)expect这里的expect同样是expect的内部命令主要功能:判断输出结果是否包含某项字符串,没有则立即返回,否则就等待一段时间后返回,等待时间通过timeout进行设置5)send执行交互动作,将交互要执行的动作进行输入给交互指令命令字符串结尾要加上r,如果出现异常等待的状态可以进行核查6)exp_continue继续执行接下来的交互操作7)interact执行完后保持交互状态,把控制权交给控制台;如果不加这一项,交互完成会自动退出8)$argvexpect 脚本可以接受从bash传递过来
6、的参数,可以使用 lindex $argv n获得,n从0开始,分别表示第一个,第二个,第三个参数范例1:免密码通过SSH登录服务器rootpanda72 # cat ssh.exp #!/usr/bin/expect#set ipset ipaddress 192.168.20.101#set userset name root#set passwdset passwd 123456#set timeoutset timeout 30#ssh processspawn ssh $name$ipaddress#进行判断expect yes/no send yesr;exp_continue p
7、assword send $passwdr #interactexpect #send useradd xuegod-1705rsend pwdrexpect eofrootpanda72 # chmod +x ssh.exprootpanda72 # ./ssh.exp范例2:实现通过SSH自动登录对服务器进行批量管理1、先写一个SSH自动登录脚本rootxuegod67 opt# cat ssh2.exp #!/usr/bin/expectset ipaddress lindex $argv 0set passwd lindex $argv 1set timeout 3spawn ssh
8、root$ipaddressexpect yes/no send yesr;exp_continuepassword send $passwdr;expect *from*send mkdir -p /tmp/xuegodexpect #expect eof2、准备一个文件用来存放IP地址和密码rootxuegod67 opt# cat passwd.txt 192.168.1.63 rootroot192.168.1.222 rootroot192.168.1.64 1234563、调用ssh2.exp自动登录脚本,来完成批量管理rootxuegod67 opt# cat login.sh
9、#!/bin/bashfor i in awk print $1 /mnt/ip-passwd.txtdoj=grep $i /mnt/ip-passwd.txt |awk print $2expect /mnt/ssh2.exp $i $jdone第2章 正则表达式的使用重要的文本处理工具:vim sed awk grep2.1 概念正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式
10、,这就是正则表达式正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串;u 是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。 u 用某种模式去匹配一类字符串。u shell元字符(也叫通配符):由shell来解析,如rm rf *.txt,元字符* shell把它解析为任意多个字符u 正则表达式元字符:由各种执行模式匹配操作的程序来解析,比如:vi、grep、sed、awk、python、mysql例如:rootpanda72 mnt# egrep :digit:1,3.:digit:1,3.:digit:1,3.:digit:1,3 ip.txt 172.16
11、.10.110.10.1.15.6.7.8192.168.45.244rootpanda72 mnt# egrep 0-91,3.0-91,3.0-91,3.0-91,3 ip.txt 172.16.10.110.10.1.15.6.7.8192.168.45.244第3章 sedstrem editor 流编辑器3.1 概念sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed
12、命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;sed也是支持正则表达式的,如果要使用扩展正则加参数-r3.2 如何使用语法格式:sed options command filename范例1:将paswd文件中的root替换为awkrootpanda # sed s/root/awk/ passwd newfilename注意:s/././是分隔符,分割符 / 可以用别的符号代替 , 比如 “,” “|” “_“等 .rootpan
13、da mnt# head -10 /etc/passwd a.txt rootpanda mnt# sed s_/bin/bash_/sbin/nologin_ a.txt 显然 , 此时用 _ 作分割符比 / 好得多另外:rootpanda opt# sed #root#cAWK a.txt 直接进行匹配处理,在特殊符号前加斜线声明一下。如果是查找替换则不用范例2:用 & 表示前面匹配的字符串sed 默认只替换搜索字符串的第一次出现 , 利用 /g 可以替换搜索字符串所有范例3:同时替换多项内容:-erootpanda mnt# sed -e 1d -e 2s/sbin/*/ a.txt b
14、in:x:1:1:bin:/bin:/*/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinrootpanda mnt# head -5 /etc/passwd a.txtrootpanda mnt# sed s/root/&/g;s/daemon/g a.txt&:x:0:0:&:/&:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin:x:2:2:/sbin:/sbi
15、n/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinrootpanda mnt# sed -e 3s/nologin/bash/ -e 4s/adm/$/g a.txtroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/bash$:x:3:4:$:/var/$:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/
16、sbin/nologin3.3 参数列表可以参考下面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之前的
17、内容范例4:显示文件第三行打印日志的5月3号的前5 行1. # sed -n /Jun 8/ p /var/log/messages | sed -n 1,5p范例5:显示文件前三行rootpanda mnt# head -3 passwd roooot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologinrootpanda mnt# sed -n 1,3p passwd roooot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:
18、/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin只显示第1行和第3行内容rootpanda mnt# nl a.txt|sed -n -e 1p;3p 1root:x:0:0:root:/root:/bin/bash 3daemon:x:2:2:daemon:/sbin:/sbin/nologin范例6:显示文件除前三行之外的全部内容rootpanda # sed -n 1,3!p passwd范例7:显示文件第三行和之后的三行rootpanda mnt# nl passwd |sed -n 5,+4p 5adm:x:3:4:adm:/var/ad
19、m:/sbin/nologin 6lp:x:4:7:lp:/var/spoool/lpd:/sbin/nologin 7Sync:x:5:0:sync:/sbin:/bin/sync 8shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9Halt:x:7:0:halt:/sbin:/sbin/halt范例8:在文件头插入“#”rootpanda # sed 1i#& b.txt范例9:在文件尾插入rootpanda # sed $a passwd范例10:在文件的第二行后插入两行内容rootpanda # sed 2a hello b.txtroo;ro
20、ot;rootww;www;wwwwwhello rootpanda # sed 2a hello nihao a b.txtroo;root;rootww;www;wwwwwhello nihao a范例11:把文件第三行替换成“$”rootpanda # cat b.txt roo;root;rootww;www;wwwwwxxxxxxxxxxrootpanda # sed 3c$ b.txt roo;root;rootww;www;wwwww$rootpanda # sed 3c% b.txt roo;root;rootww;www;wwwww%rootpanda opt# sed /S
21、ELINUX=/cSELINUX=disabled /etc/selinux/config -针对查找到的内容进行替换rootpanda72 mnt# sed /SELINUX=/cSELINUX=disabled /etc/selinux/config Crootpanda72 mnt# sed s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config C范例12:sed 的-i选项可以直接修改文件中的内容rootxuegod60 # sed -i s/root/rm/ passwd范例13:复制粘贴将2到4行贴到尾rootpanda
22、 mnt# sed 2,4H;$G a.txt d.txtrootpanda mnt# cat d.txt root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin*adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spoool/lpd:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologin*adm:x:3:4:adm:/var/adm:/sbin/nologin将1到3行贴到第6行后面rootpanda # sed 1,3H;6G
23、a.txtabcdefabcg将第5行内容替换为第2行的内容,有下面两种写法rootpanda # cat mima adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinSync:x:5:0:sync:/sbin:/bin/syncsunc:x:5:0:sunc:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownHalt:x:7:0:halt:/sbin:/sbin/haltrootpanda # sed 2h;/shutdow
24、n/g mima adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinSync:x:5:0:sync:/sbin:/bin/syncsunc:x:5:0:sunc:/sbin:/bin/synclp:x:4:7:lp:/var/spool/lpd:/sbin/nologinHalt:x:7:0:halt:/sbin:/sbin/haltrootpanda # sed 2h;5g mima adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/s
25、pool/lpd:/sbin/nologinSync:x:5:0:sync:/sbin:/bin/syncsunc:x:5:0:sunc:/sbin:/bin/synclp:x:4:7:lp:/var/spool/lpd:/sbin/nologinHalt:x:7:0:halt:/sbin:/sbin/halt范例14:删除空行rootpanda# sed /$/d passwd c.txtrootpanda72 mnt# sed -n /$/p /etc/ssh/sshd_config |wc -l范例15:将匹配的行记录到新的文件中把fstab中包含xfs的记录(行)写入新的文件中root
26、panda # sed /xfs/w newfstab /etc/fstabrootpanda # cat newfstab UUID=d58f48eb-26cd-45a4-87f6-d6018dbe443b / xfs defaults 0 0UUID=b00399dc-6868-4295-837a-a3ad42e6f901 /boot xfs defaults 0 0范例16:备份,把原文件备分后,再进行修改原文件rootpanda # sed -i.bak 1c* b.txt rootpanda # cat b.txt*wwwwwwwwwwwwwwwGGGGGGGGGrootpanda
27、# cat b.txt.bak rootrootrootrootwwwwwwwwwwwwwwwGGGGGGGGG范例17:读入文件rootpanda opt# sed 3r/etc/hosts c.txtrootpanda opt# sed /root/r/etc/hosts c.txt=删除文件中空行和#号开头的行cp /etc/ssh/sshd_config /opt/test.txtrootpanda opt# cat apache.conf |wc -l153rootpanda opt# grep $ apache.conf |wc -l26rootpanda opt# grep #
28、apache.conf |wc -l110rootpanda opt# grep -v #|$ apache.conf |wc l -或者的使用17rootpanda opt# sed /#|$/d apache.conf |wc -l17脚本替换rootpanda opt# for i in 1.100;do echo $i $i0 $i00 a.txt;donerootpanda opt# sed -n /10/p a.txt -这个是 / /匹配模式1 10 10010 100 100011 110 110021 210 210031 310 310041 410 410051 510
29、510061 610 610071 710 710081 810 810091 910 9100100 1000 10000rootpanda opt# sed -n /10/s/10/A/p a.txt 查找10并对找到的10进行替换A0 1000 100001 A 100A 100 100011 1A 110021 2A 210031 3A 310041 4A 410051 5A 510061 6A 610071 7A 710081 8A 810091 9A 9100A0 1000 10000rootpanda opt# sed 4,6d a.txt -删除第4到6行4 40 4005 5
30、0 5006 60 6007 70 7008 80 8009 90 90010 100 100011 110 110012 120 120013 130 130014 140 140015 150 1500rootpanda opt# sed 13d a.txt -第1行开始每3行删除一行2 20 2003 30 3005 50 5006 60 6008 80 8009 90 90011 110 110012 120 120014 140 140015 150 1500第4章 其它4.1. SFTP从AIX传输文件到WIN2008脚本1. #!/usr/bin/expect2. #远程主机信息
31、配置3. set sftp_host 11.11111.111.14. set sftp_port 225. set sftp_user aaa6. set sftp_password xxx7. set sftp_remote_dir /8.9. #本地信息配置10. set local_dir /brcb_edp/TMPDATA/awk/shengji11. set timeout -112.13. #sftp put file to remote server14. spawn sftp -o port=$sftp_port $sftp_user$sftp_host15. expect *assword*16. send $sftp_passwordr17. send lcd $local_dirr 切换本地目录18. expect sftp19. send cd $sftp_remotet_dirr 切换远程服务器目录20. expect sftp21. send put HD_COBS2014.txtr put上传:把本地内容上传到远程服务器 get下载:从远程服务器下载东西到本地22. expect sftp23. send quitr24. expect eof