expect正则表达式和sed的使用

expect正则表达式和sed的使用

实战: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安装包

[[email protected]~]# 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!
[[email protected] ~]#

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     [email protected]$ipaddress      #spawn是一个SSH登录进程

expect {                           #等待响应,根据提示进行判断

"yes/no"        { send "yes\r";exp_continue }
#注意左大括号前空格的问题  #\r代表回车 #exp_continue代表继续执行
"password"      { send "$passwd\r"; }        #\r代表回车

}

interact                       #登录到远程服务器不退出

~                                                                   
#或者使用此命令执行
[[email protected] ~]# expect sshd.exp
spawn ssh [email protected]
[email protected]‘s password:
Last login: Wed Jul 12 19:46:39 2017 from192.168.100.131
[[email protected] ~]#

[[email protected] ~]# ./sshd.exp
-bash: ./sshd.exp: 权限不够
[[email protected] ~]# chmod +x sshd.exp
[[email protected] ~]# ll !$
ll sshd.exp
-rwxr-xr-x. 1 root root 272 7月  12 18:03 sshd.exp
[[email protected] ~]#
[[email protected] ~]# ./sshd.exp
spawn ssh [email protected]
[email protected]‘s password:
Last login: Wed Jul 12 18:18:34 2017 from192.168.100.131
[[email protected] ~]# 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)

[[email protected] ~]#

例子二:实现通过SSH自动登录对服务器进行批量管理



1.写一个ssh自动登录脚本

例子:

set ip [lindex $argv 0] #引用第一个常量 set password [lindex $argv 1] #引用第二个常量

执行时输入如下:

expect a.exp 192.168.100.110 #相当于argv0量 linuxtouch#相当于argv1

[[email protected]~]# cat a.exp
#!/usr/bin/expect
set ip [lindex $argv 0]                #引用第一个常量
set password [lindex $argv 1]          #引用第二个常量
set timeout -1
spawn ssh [email protected]$ip
expect {
   "password" { send "$password\r"; }
   "yes/no" { send "yes\r";exp_continue }
}

expect "#"               #[[email protected]~]#
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地址和密码

[[email protected]~]# cat passwd.txt
192.168.100.129  linuxtouch
192.168.100.130  linuxtouch123
[[email protected] ~]#

3.直接测试,脚本目前还没有写好写好后挥发另外一篇帖子

[[email protected]~]# cat  passwd.txt |  grep 192.168.100.129  | xargs ./a.exp
spawn ssh [email protected]
[email protected]‘s password:
Last login: Wed Jul 12 23:33:21 2017 from192.168.100.131
[[email protected] ~]# mkdir -p /linux/touch
[[email protected] ~]# exit
logout
Connection to 192.168.100.129 closed.
[[email protected] ~]# cat  passwd.txt | grep  192.168.100.130  | xargs ./a.exp
spawn ssh [email protected]
[email protected]‘s password:
Last login: Wed Jul 12 18:35:49 2017 from192.168.100.1
[[email protected] ~]# mkdir -p /linux/touch
[[email protected] ~]# exit
logout
Connection to 192.168.100.130 closed.
[[email protected] ~]#

查看192.168.100.129是否创建/linux/touch目录
[[email protected] ~]# cd /linux/touch/
[[email protected] touch]# pwd           #创建成功
/linux/touch
[[email protected] touch]#
[[email protected] 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
[[email protected] touch]#
查看192.168.100.130是否创建/linux/touch目录
[[email protected] ~]# cd /linux/touch/
[[email protected] touch]# pwd           #创建成功
/linux/touch
[[email protected] 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
[[email protected] 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被替换

[[email protected]~]# sed ‘s/root/awk/‘ a.txt | grep root
awk:x:0:0:root:/root:/bin/bash
ASDF:awk:asdfas:root
[[email protected] ~]#

实例二:将a.txt文件中的所有root字符全部替换成awk

[[email protected]~]# sed ‘s/root/awk/g‘ a.txt |  grep root
#通过grep过滤出root的行,但是没有,说明成功
[[email protected] ~]# 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
[[email protected] ~]#

注意:s/../../是分隔符,分割符 "/" 可以用别的符号代替 , 比如 “,” “|” “_“ .

实例三:将a.txt文本中的/sbin/nologin 替换为 /sbin/hehehe

[[email protected]~]# 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
[[email protected] ~]#

此时的‘_’分隔符是不是比‘/’分隔符更好用一点

另外:[[email protected]]# sed ‘#root#cAWK‘ a.txt
#直接进行匹配处理,在特殊符号前加斜线声明一下。如果是查找替换则不用

实例四:用&表示前面匹配的字符串整个文件

[[email protected]~]# 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
[[email protected] ~]#

实例五:将a.txt文件中的第一行删除,将第二行的sbin替换为****,查看前5行

注释:

-e:同时替换多项内容-e进行多个字符的匹配

[[email protected]~]# 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
[[email protected] ~]#

实例六:进行三次替换,将awk替换为&,将daemon替换为@,将x替换为****** 全部替换,只显示文本中前10行

#原文本内容
[[email protected] ~]# 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
[[email protected] ~]#

[[email protected] ~]# 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
[[email protected] ~]#

实例七:将第三行的nologin替换为bash并且将第四行的adm替换为两个$$显示前5行

#原文本内容
[[email protected] ~]# 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
[[email protected] ~]#

[[email protected] ~]# 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
[[email protected] ~]#

实例八:显示文件的第三行内容

[[email protected]~]# sed -n ‘3p‘ a.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# 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
[[email protected] ~]#

实例九:将全文中的所有awk字符替换为hehehehehe并打印出来

#未更改之前的文本内容
[[email protected] ~]# 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
[[email protected] ~]#

[[email protected] ~]# 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
[[email protected] ~]#

实例10:将/var/log/messages 中开头是Jul 13字符的打印出来只打印第1行到第5行

[[email protected]CentOS6-node1~]# grep "Jul 13" /var/log/messages  | wc -l
1417
[[email protected] ~]# 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 ([email protected]) (gcc version 4.4.720120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013
[[email protected] ~]#

实例11:显示a.txt文本中的2-3行的内容

[[email protected]~]# sed -n ‘2,3p‘ a.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]#

实例12:显示第一行和第三行内容

nl:查看文本内容并以行号显示出

[[email protected]~]# 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
[[email protected] ~]#

实例13:显示文件中除前3行的内容

[[email protected]~]# 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
[[email protected] ~]#

实例14:显示文件中第三行和之后的三行

[[email protected]~]# 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
[[email protected] ~]#

实例15:在文件头插入“###”

[[email protected]~]# sed -i ‘1i###‘  a.txt
[[email protected] ~]#
[[email protected] ~]# 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
[[email protected] ~]#

实例16:在文件尾部插入“@@@”

[[email protected]~]# sed  ‘[email protected]@@‘ a.txt
.........
oprofile:x:16:16:Special user account to be used byOProfile:/home/oprofile:/sbin/nologin
ASDF:awk:asdfas:awk
/bin/bash asdfasjdfqwerp
@@@
[[email protected] ~]#

实例17:在文件第二行后插入两行内容

[[email protected]~]# 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:把文件第三行替换为“$$$”

[[email protected]~]# sed ‘3c$$$‘ a.txt
###
awk:x:0:0:awk:/awk:/bin/bash
$$$
daemon:x:2:2:daemon:/sbin:/sbin/nologin

实例19:把文件中以SELINUX开头的行替换为SELINUX=disabled

[[email protected]~]# 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

[[email protected] ~]#

实例20:将2到4行复制到尾行

[[email protected]~]# sed ‘2,4H;$G‘  a.txt  > qwer.txt
[[email protected] ~]# 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
[[email protected] ~]#

实例21:将第一行复制到第6行后面

[[email protected]~]# sed ‘1,3H;6G‘ a.txt > qwer.txt
[[email protected] ~]# 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行的内容,有下面两种写法

#第一种
[[email protected] ~]# 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

#第二种
[[email protected] ~]# 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:删除文本中的所有空行

[[email protected]~]# cat a.txt | tail -10
asdfasdf
werqwer

asdf
asd
f
asdf
qwere

[[email protected] ~]#

[[email protected] ~]# sed ‘/^$/d‘  a.txt
............
ASDF:awk:asdfas:awk
/bin/bash asdfasjdfqwerp
asd
asdfasdf
werqwer
asdf
asd
f
asdf
qwere
[[email protected] ~]#

实例24:备份,把原文件备份后,在进行修改原文件

[[email protected]~]# sed -i.bak ‘1c************‘  a.txt
[[email protected] ~]# 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                   公共的                桌面
[[email protected] ~]#

[[email protected] ~]# cat a.txt
************
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

[[email protected] ~]# cat a.txt.bak
###
awk:x:0:0:awk:/awk:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

实例25:删除文件中空行和#号开头的行

[[email protected]~]# sed ‘/^#\|^$/d‘ abc  |wc -l
13
[[email protected] ~]#
[[email protected] ~]# grep -v ‘^#\|^$‘  abc | wc -l
13
[[email protected] ~]#
[[email protected] ~]# 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
[[email protected] ~]#

脚本替换



[[email protected] opt]#for i in {1..100};do echo "$i ${i}0 ${i}00" >> a.txt;done
[[email protected] 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
[[email protected] 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
[[email protected] 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
[[email protected] 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

SFTP从AIX传输文件到WIN2008脚本

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  [email protected]$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

时间: 2024-11-18 08:51:23

expect正则表达式和sed的使用的相关文章

使用方便 正则表达式grep,sed,awk(一)

一些无稽之谈: 对于正则表达式,永远似了解不明白,看到一些代码,脚本定期,awk,sed.心里总有点虚.主要是记不住.平时又没怎么用,也就没总结了. 如今有空,决定总结一下,顺便克服一下看到shell,js这些带有正则就心虚的弱点. 打算分三篇文章来写 正文: 一般来说,正则分好几种.但基本都差点儿相同,我所了解的有 "基本正则","扩展正则"及"perl正则",本文更偏向说记录"基本正则"和"扩展正则",

正则表达式和sed的使用

1  字符串的组合表达有重复和逻辑两种方法 2  重复 *  零次或多次匹配前面的字符或子表达式 +  一次或多次匹配前面的字符或子表达式 ? 零次或一次匹配前面的字符或子表达式 3  用法格式:grep  '字符串如se*'  表名或文档名 4  注意1加号和问号前面一定要加斜线如'se\+'和'se\?' 5  括号和大括号加入到正则表达式中一定要加斜线如'\(se\)'*和'\{se\}' 6  重复特定次数:[n,m]     n重复最小次数  m重复最大次数 7  任意字符串的表式:

python 全栈 linux基础 (部分)正则表达式 grep sed

/etc/profile /etc/bashrc  .变量添加到shell环境中,永久生效. /root/.bashrc /root/.bash_profile 正则表达式 定义:正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.(被命令所解释) 三种文本处理工具/命令:grep sed awk grep(过滤) 参数 -n  :显示行号 -o  :只显示匹配的内容 -q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 -l

正则表达式跟sed命令(草稿)

正则表达式. 匹配任何单个的字符* 匹配在它之前的任何数目的单个字符(可以为正则表达式,如.*代表匹配任一字符的任意长度)^ 匹配紧接着的正则表达式,在行或字符串的起始处$ 匹配前面的正则表达式,在字符串或行结尾处[...] 匹配方括号内的任一字符((-)指的是连续字符的范围,(^)则由反向意义)\{n,m\} 匹配在它前面的单个字符重现的次数区间.\{n\}指的是重现n次: \{n,\}则为至少重现n次,\{n,m\}为重现n至m次\{ \} 将\与\之间的模式存储在特殊的“保留空间”(最多9

对于Linux正则表达式在sed awk 过滤中的深入浅出

作为初学者,刚刚接触正则表达式,一定是一头雾水,不过没关系,用例子来说明. ==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==*==* 一.先来看看正则表达式是什么: 正则表达式定义: 简单的说,正则表达式就是一套处理字符串的规则和方法,以行为单位对字符串进行处理.通过特殊的符号的辅助,我们可以快速的过滤,替换某些特定的字符串.运维工作中,会有大量访问日志,错误日志,大数据,如何能够快速的过滤出我们需要的内容,

正则表达式——grep, sed,awd

一.正则表达式的定义: 就是以行为单位处理字符串的方式. 1. 元字符:不表示字符本身的意义,用于额外功能性的描述. 1)字符匹配: .:匹配任意单个字符 []:匹配指定范围内的任意单个字符                  [^]:匹配指定范围外的任意单个字符 [:digit:]:代表数字,既0-9                  [:alnum:]:代表代表英文大小写字符及数字,即a-z,A-Z,0-9                  [:alpha:]:代表代表英文大小写字符a-z,A

正则表达式和sed命令的用法

一.            正则表达式:   正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.gre

正则表达式笔记 sed工具

[:alnum:] 代表英文大小写字符及数字,即0-9 A-Z a-z [:alpha:] 代表任何英文大小写字符,即A-Z a-z [:blank:] 代表空格键与TAB键 [:cntrl:] 代表键盘上面的控制案件,即包括CR LF TAB DEL等 [:digit:] 代表数字 0-9 [:graph:] 除了空格键与TAB键外其他的所有键 [:lower:] 代表小写字符 a-z [:print:] 代表任何可以被打印出来的字符 [:punct:] 代表标点符号 即"';:!#$等 [:

正则表达式、sed、awk相关资料笔记资料整合

正则表达式元字符: ^   #锚定行的开始.如:/^sed/ 匹配所有以sed开头的行. $   #锚定行的结束.如:/sed$/ 匹配所有以sed结尾的行. .   #匹配一个非换行字符. 如:/s..d/ 匹配s后接任意两个个字符,最后是d. *   #匹配零个或多个字符. 如:/*sed/ 匹配所有模板是一个或多个空格后紧跟sed的行. []   #匹配一个指定范围内的字符. 如/[Ss]ed/ 匹配Sed和sed. [x-y]   #匹配指定范围内的一个字符. 如 /[a-z]ed/ 匹