字符串处理(系统指标提取)、扩展技巧、正则表达式
今日目标:
1)字符串处理(系统指标提取/生成/配置内容替换)
2)扩展脚本技巧(Shell数组、expect交互登录)
3)正则表达式(用特殊的符号来表示不确定的字符串)
pgrep .
任务需求:
1)提取/etc/selinux/config文件的 ^SELINUX= 行保存到变量 A
2)用三种不同方法截取变量A的前7个字符、=号之后的所有字符
# A=$(grep ^SELINUX= /etc/selinux/config)
云服务器(虚拟机)的虚拟网卡的地址
任务需求:
1)生成一个随机的8位密码字串
# uuidgen | cut -b -8
2)编写脚本 /sbin/macgen,执行此命令后能生成一个mac地址,这个mac地址的前3组为 52:54:00,后3组要随机生成
echo "52:54:00:xx:yy:zz"
#!/bin/bash
echo "52:54:00:$(uuidgen |cut -b -2):$(uuidgen |cut -b -2):$(uuidgen |cut -b -2)"
字符串拼接方式:
#!/bin/bash
XX="52:54:00"
for i in 1 2 3
do
XX="$XX:$(uuidgen | cut -b -2)"
done
echo $XX
路径分割:
dirname 文档路径 —— 取得文档的存放位置
basename 文档路径 —— 取得文档的基本名称
vim编辑器的末行替换操作
:s /old/new/
:s /old/new/g
字串替换:
${var/old/new}
${var//old/new}
键盘上 # 在 % 左边
字串砍头:
${var#*关键词}
${var##*关键词} 【贪婪模式】
字串剁脚:
${var%关键词*}
${var%%关键词*} 【贪婪模式】
任务需求:
1)提取server0上Web服务的网页目录配置,保存到变量webroot
# webroot=$(grep ^DocumentRoot /etc/httpd/conf/httpd.conf)
2)采用剁脚方式处理变量webroot,把网页目录改成 /tedu
# echo "${webroot%% *} /tedu"
3)采用字串替换方式处理变量webroot,把网页目录改成 /tedu
# echo ${webroot/"/var/www/html"/"/tedu"}
4)采用砍头方式处理变量webroot,只保留目录部分
# echo ${webroot#* }
5)编写脚本ren1.sh,将当前目录下的 .txt文件的扩展名改为 .text
6)编写脚本ren2.sh,将当前目录下的 .text文件的扩展名改为 .txt
#!/bin/bash
for FILE in *.text
do
mv $FILE ${FILE%.text*}.txt
done
7)编写脚本ren3.sh,将当前目录下的 $1 文件的扩展名改为 $2
#!/bin/bash
for FILE in *$1
do
mv $FILE ${FILE%$1*}$2
done
Shell变量的初始值
${var:=初始值}
任务需求:
1)编写一个脚本,计算从1~x之间所有整数的和
2)x的值由脚本在运行时提示用户输入,若未输入则默认取值为 1
#!/bin/bash
read -p "Input an integer: " x
while [ "${i:=1}" -le "${x:=1}" ]
do
let sum+=$i
let i++
done
echo "sum=$sum"
变量:使用一个固定的名称来存放一个变化的值
数组:使用一个固定的名称来存放多个变化的值
星期袜/裤 ——
周一 ==》 红色
周二 ==》 橙色
.. ..
周日 ==》 紫色
定义数组:星期袜=(红色 橙色 .. .. 紫色)
调用数组元素:echo ${星期袜[0]}、echo ${星期袜[1]}
任务需求:
改写 chuquan.sh 脚本,利用数组简化代码
#!/bin/bash
quan=(石头 剪刀 布)
echo ${quan[$[RANDOM%3]]}
获取一个数组的元素的个数:
echo ${#数组名[@]}
获取一个变量的字符个数:
echo ${#变量名}
echo ${#数组名[0]}
expect预期交互 ——
<< 操作,用来指定一段文档的起始和结束标记
命令行 << EOF
line asdfasd
line asdfs
EOF
任务需求:编写脚本 ssh.sh
1)能够自动向远程的 server0、desktop0这两台主机部署文件
2)部署的文件内容为"TEDU.CN",文件位于 /tmp/mike.txt
#!/bin/bash
for ip in server0 desktop0
do
expect << EOF
spawn ssh -o StrictHostKeyChecking=no root@$ip
expect "password" {send "redhat\r" }
expect "#" {send "echo TEDU.CN > /tmp/mike.txt\r" }
expect "#" {send "exit\r" }
EOF
done
echo "文件部署完毕"
任务需求:使用 egrep 完成下列操作
1)列出 /etc/resolv.conf 中包含 net(-i忽略大小写) 的行
2)列出 /etc/resolv.conf 中包含 nameserver 的行
3)列出 /etc/resolv.conf 中不包含 nameserver 的行(-v)
4)列出 /etc/resolv.conf 中以 # 开头或包含 domain 的行(|)
5)列出 /etc/resolv.conf 中包含 172 的行的行号(-n)
6)列出 /etc/resolv.conf 中包含 172 的行的数量(-c)
7)检查 /etc/resolv.conf 中是否已设置 172.25.254.254,如果是则显示yes,不要显示其他无关信息
# egrep -i net /etc/resolv.conf
# egrep nameserver /etc/resolv.conf
# egrep -v nameserver /etc/resolv.conf
# egrep '^#|domain' /etc/resolv.conf
# grep -n 172 /etc/resolv.conf
# grep -c 172 /etc/resolv.conf
# grep -q 172.25.254.254 /etc/resolv.conf && echo yes
正则表达式 —— 通用知识
通过特殊符号来描述一个字符串的特点
a
TEDU
10k+
10k?
任务需求:
1)提取网卡eth0的mac地址
# ifconfig eth0 | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}'
aa:bb:cc:dd:ee:ff
==》 ..:..:..:..:..:..
==》
[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}
==》
([0-9a-f]{2}:){5}[0-9a-f]{2}
2)提取网卡eth0的IP地址
# ifconfig eth0 | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
aaa.bbb.ccc.ddd
==》.{1,3}\..{1,3}\..{1,3}\..{1,3}
==》[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
==》([0-9]{1,3}\.){3}[0-9]{1,3}
匹配1开头、1结尾的IP地址字符串:
1[0-9]{0,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{0,2}1
+ --》匹配最少一次
? --》匹配最多一次
* --》匹配任意多次
.* --》匹配任意长度的任意字符
[ ] --》匹配范围内任意字符
{n,m} --》匹配前面的字符或字符串指定的次数(从n~m次)
任务需求:
1)找出 /etc/resolv.conf 文件中每一行的前3个字符
# egrep -o '^...' /etc/resolv.conf
# cat /etc/resolv.conf | cut -b -3
2)找出 yum info httpd 命令行结果中包含 http://。。。/ 的行
# yum info httpd | egrep 'http://.*/'
转义(改变字符本来的含义)符号\
\b 代表单词边界
\. 只匹配一个 .
总结:
1)字符串处理(子串截取、替换、砍头、剁脚、初始值)
2)数组
3)expect预期交互
4)正则表达式
任务需求:
1)新建一个文档 reg.txt ,内容如下
12345@163.com
http://sina.com.cn
172.25.0.11
版权所有@2018
1.2.3.4.5.6.7.8
zhsan@tarena.com.cn
2)列出 reg.txt 文件中以数字开头的行
3)列出 reg.txt 文件中合法的电子邮件地址
4)列出 reg.txt 文件中合法的IP地址
回顾:
1)字符串处理
如何从一个字符串里截取一部分:
${变量名:起始位置:长度}
${变量名::长度}
${变量名:起始位置}
命令行 | cut -b 起始位置-结束位置
命令行 | cut -b -结束位置
命令行 | cut -b 起始位置-
命令行 | cut -b 字符位置
命令行 | cut -d '分隔符' -f 起始字段-结束字段
如何替换一个字符串里的一部分:
${变量名/old/new}
${变量名//old/new}
如何删除一个字符串开头的一部分(砍头):
${变量名#*关键词}
${变量名##*关键词}
如何删除一个字符串结尾的一部分(剁脚):
${变量名%关键词*}
${变量名%%关键词*}
如何为一个变量指定初始值:
${变量名:=初始值}
2)数组
数组名=(值1 值2 值3 .. ..)
${数组名[下标编号]}、${数组名[@]}
数组名[下标编号]=新的值
${#数组名[@]}、${#变量名}
3)expect预期交互
如何在一个Shell脚本内部嵌入expect代码,来实现预期交互
#!/bin/bash
其他shell语句.. ..
expect << EOF
spawn ssh、ftp等需要交互操作的命令行
expect "预计会出现的提示信息" { send "需要输入的信息\r"}
expect "预计会出现的提示信息" { send "需要输入的信息\r"}
expect "预计会出现的提示信息" { send "需要输入的信息\r"}
EOF
4)正则表达式
使用特殊的字符来表示不确定的字符串
^.*root.*$
指定匹配次数的 ——
+ 最少一次
? 最多一次
* 任务多次
{n,m} 从n到m次
{n} n次
{,m} 最多m次
{n,} 最少n次
指定匹配范围的 ——
[axM?#] 匹配这个集合里单个字符
[^axM?#] 匹配不包括这个集合里单个字符
\
()
|
列出系统当中使用的登录Shell是/bin/bash或用户名是adm的账号名称?
# egrep '/bin/bash|adm' /etc/passwd | cut -d: -f1
Shell编程综合练习:
1. 编写一个死循环测试脚本
1)执行脚本后打开firefox浏览器,访问http://server0.example.com/
2)如果firefox窗口被关闭,自动重启步骤1
提示:
!!!! 使用 while true 死循环,调用 firefox URL 操作
2. 编写序列用户管理脚本
1)编写脚本 uadd.sh,能够批量添加用户 ceshi01、ceshi02、……、ceshi20
2)编写脚本 udel.sh,能够批量删除用户 ceshi01、ceshi02、……、ceshi20
提示:
!!!! 编号小于10的用户的名称前缀为 ceshi0,其余用户的前缀为 ceshi
!!!! 也可以用 seq -w 1 20 生成等宽数列
3. 编写脚本 tc.sh,
1)找出/usr/share/doc/下的所有文件
2)如果文件的类型是text,则wc -l统计此文件的行数,显示“文件 xxx,一共 nn 行”
3)最后显示“一共统计了 nn 个文件,累计总行数 nn 行”
提示:
!!!! 使用find命令列出所有目标文件
!!!! 通过“file 文件路径...”检测文件类型,看结果是否出现 text 以便筛选
4. 编写脚本 /root/vhost_add,为server0快速添加新的虚拟Web主机
1)虚拟主机的域名由脚本在执行时指定(./vhost_add www0.example.com),若未指定域名,则提示正确用法后退出脚本
2)如果指定FQDN的虚拟主机已经存在,提示“虚拟主机XX已存在”,退出脚本
3)执行脚本后能够向 /etc/httpd/conf.d/vhosts.conf 添加新配置
4)并为此虚拟机建立网页目录 /var/www/FQDN,首页内容为虚拟主机的域名
5)在本机 /etc/hosts 文件末尾追加“172.25.0.11 虚拟Web主机域名”记录
提示:
!!!! 需提前准备好 httpd 服务器
!!!! 通过检查 vhosts.conf 文件是否存在'.*ServerName.*域名.*”记录判断是否存在
!!!! 追加记录用echo "文件内容" >> 文件路径
5. 为指定的一批计算机远程部署XX文件
1. 需要部署的文件从网址 http://sever0.example.cm/a.html 获取
2. 部署的目标位置 /tmp/a.html
3. 目标计算机的IP地址存放在文件 ipadds.txt 中(172.25.0.11、172.25.0.10)
4. 用于认证的身份信息:用户名 root、密码 redhat
6. 正则表示式操作练习
1)新建测试文件 a.txt,内容如下
Tarena IT Group. @2018-2028
@ IN NS mail.tedu.cn
bt bat bet boot booot keroot root rooty
52:54:00:90:A7:A2
1234567@qq.com
192.168.4.5 3.1415926
1.2.3.4.5 No:6.7.8.9
hunter@tedu.cn
mike:x:500:500::/home/mike:/bin/bash
2)找出以b开始、t结尾,中间包含2~3个字母的字符串
# egrep -o 'b[a-z]{2,3}t' a.txt
3)找出包括大写字母的行、找出只包括数字或.的行
# egrep [A-Z] a.txt
# egrep -v [^0-9.] a.txt
4)找出正确的电子邮箱地址
# egrep '[a-Z0-9_]{2,}@([a-Z0-9]+\.){1,3}[a-Z0-9]{2,}' a.txt
5)找出以m结尾包括3个字符的独立字符串
# egrep '\b..m\b' a.txt
6)找出以数字开头、数字结尾的行
# egrep '^[0-9].*[0-9]$' a.txt
7)找出每行的第3个字符
# egrep -o '^(.)(.)(.)' a.txt | cut -b 3
8)找出每行的倒数第3个字符
egrep -o '(.)(.)(.)$' a.txt | cut -b 1
7. 详见TTS平台上DAy01~DAY04的“经典案例”,完成未练习过的部分

浙公网安备 33010602011771号