不需要进入文件内部,可以在文件外对文件内容进行操作
sed 最强大的功能:改 新增
awk 最强大的功能:按行取列
here document 免交互
对文本内容进行操作:标准输入的替代品
语法格式:
命令 <<标记
内容
标记
命令指的是Linux命令
以什么为开头,就以什么为结尾
注意事项:
1.标记可以使用任意合法字符。(字母和数字,一般不适用特殊符号。以字母为开头。EOF)
2.结尾的标记一定要顶格写,而且结尾的标记前不能有任何字符(包括空格,也不行)
3.开头的标记可以加空格,但是会被自动省略。
wc命令对行的统计
-l:统计行数
-c:统计字节数
-w:统计单词数

通过read命令读取
- [root@hj opt]# read i <
- > test
- > 123
- > EOF
- [root@hj opt]# echo $i
- test
- [root@hj opt]#

因为设置密码需要输入两遍,一遍设置,一遍确认,所以有两行


tee:本身就有标准输出的作用,可以直接把内容输入到文件当中

例:
向test2.txt输入了 I HAVE $i
外部再给i赋值
- #!/bin/bash
- #声明编辑器
- file="test2.txt"
- i="123"
- #给i赋值
- cat > $file <<EOF
- I HAVE $i
- #test2.txt输入 IHAVE $i
- EOF
- #标记结尾


- #!/bin/bash
- var="Great! Hello World!"
- #给var整体赋值
- myvar=$(cat <<EOF
- this is line 1;
- today is weekends
- $var
- #引用
- EOF
- )
- echo $myvar


若给EOF加上单引号,则无法交互,输出结果则直接是$var.没有具体内容


主要作用:
自动化控制和测试,解决shell脚本中交互的问题。
expect建立在tcl语言基础上的工具
常用的转义字符:
\n:相当于换行,回车
\t:制表符,相当于tab键
\r:就是回车
\b:退格符
因为expect的文件位置在/usr/bin/expect中,所以他的shell并不是默认,得手动区分
多行注释


expect免交互
Expect是建立在 tcl 语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
需要安装两个软件包:expect,tcl。但是安装了expect后就会有tcl(yum解决依赖关系就安装了tcl)
建立在 tcl 语言基础上的一个工具,常被用于进行自动化控制和测试,解决 shell 脚本中交互相关的问题
使用前需要先检查 :rpm -q expect 是否安装
如果没有安装需要 yum -y install expect 安装
expect 脚本中首先引入文件,表明使用的是哪一个 shell


相关命令
spawn后面一般都是Linux命令,表示开启会话或者进程,跟踪后续的交互信息。
捕获命令相关内容,字符串匹配
发送指令,模拟用户输入
expect "密码" {send "123456\r" }
写在一行必需要用花括号括起来
expect “密码”
send "123456\r"
换行不需要花括号
expect
{
"密码1" {send "123456\r"}
"密码2" {send "123456\r"}
"密码3" {send "123456\r"}
}
结束符:
1.expect eof
表示交互结束,等待执行结束,退回到原来的用户
expect默认等待时间是10秒 #退回之前的终端
2.interact
执行完成之后保持状态,把控制权交给控制台,然后停留在目标终端,不会退回原终端。
注意:只能二选一
set timeout 5

[lindex $argv 0]为位置变量
exp_continue 和 expect是结合起来一起使用的,附加在expect判断项之后,匹配到expect的捕获内容之后的其他选项
以 ssh@root 20.0.0.10为例
- expect {
-
- "connecting (yes/no)?" {send "yes\r"; exp_continue;}
-
- }
-
- expect
-
- set
-
- send_user
-
- #回显命令,跟echo一样,打印内容
- #!/usr/bin/expect
- #使用expect得声明编辑器
- set time 5
- #设置超时时间
- spawm passwd hj
- #给hj用户修改密码
- expect "New passwd:"
- #捕获的内容是后续需要模拟用户输入的内容
- send "123456\r"
- expect "Retype passwd:"
- send "123456\r"
-
- expect eof


自动修改成功

一定要给脚本权限,否则无法运行

将expect免交互的过程和shell结合起来
ssh su 会涉及到终端切换,不建议使用嵌入式执行


ssh自动登录实现
- #!/usr/bin/expect
- set timeout 5
- set username [lindex $argv 0]
- set passwd [lindex $argv 1]
- #传参
-
- #开启进程,捕获
-
- spawn ssh $username
-
- #捕获条件
- expect {
- "No route to host" {send_user "主机名/IP有误\n"}
- "Connection refused" {send_user "ssh访问被拒绝\n}
- "(yes/no)?" {send "yes\r";exp_continue;}
- "passwd" {send "$passwd\r"}
- }
- interact


免交互的方式进行硬盘分区和格式化以及挂载
- #!/bin/bash
-
- name=$1
-
- /usr/bin/expect <<-EOF
- set timeout 5
- spawn fdisk $name
- expect "Command"
- send "n\r"
- expect "Select"
- send "p\r"
- expect "Partition"
- send "\r"
- expect "First sector"
- send "\r"
- expect "Last sector"
- send "+2G\r"
- expect "Command (m for help)"
- send "w\r"
- interact
- EOF
-
- partprobe
- num=$(lsblk | egrep -o sd[b-z][1-9]+ | sed -n '$p')
- #进行过滤,取最后一行,所以创建分区必须从头到尾
- #如果想避免此情况可以设定参数直接在最后赋值
- mkfs.xfs /dev/${num}
- #创建文件系统
- mkdir /opt/${num}
- #创建挂载目录
- mount /dev/${num} /opt/${num}
- #挂载

免交互任务完成思路