SHELL 编程正则表达式
一、自动磁盘分区与挂载
核心工具:fdisk
(分区)、mkfs
(格式化)、mount
(挂载),结合expect
实现自动化交互。
脚本关键点:
- 使用
expect
脚本模拟交互式输入(如n
创建分区、p
主分区、wq
保存)。 - 示例命令:
expect << EOF
spawn fdisk /dev/sdc
expect "命令*" {send "n\r"}
# 后续依次响应分区类型、大小等提示
expect eof
EOF
二、批量用户创建与管理
场景:通过expect
远程批量创建用户到多台主机。
脚本核心:
- 使用
ssh
远程连接,useradd
创建用户,passwd --stdin
设置密码。 - 示例片段:
expect << EOF
spawn ssh root@10.0.0.12
expect "password" {send "123456\n"}
expect "]#" {send "useradd jack\n"}
expect "]#" {send "echo 123456 | passwd --stdin jack\n"}
EOF
三、正则表达式基础
1. 字符匹配
- 单字符匹配:
.
:任意单个字符(如st..e
匹配state
)。[]
:指定范围内字符(如[a-z]
匹配小写字母)。[^]
:范围外字符(如[^0-9]
匹配非数字)。
- 示例:
grep '[s-t]' file # 匹配包含s到t之间字母的行
2. 锚定匹配
- 位置限定:
^
:行首(如^user
匹配以 user 开头的行)。$
:行尾(如\.conf$
匹配以.conf 结尾的行)。\<
/\>
:单词首尾(如\<root\>
匹配独立单词 root)。
- 示例:
grep '^[a-z]' file # 匹配以小写字母开头的行
3. 分组与限定
- 分组:用
()
提取匹配内容,\1
引用第一组,\2
引用第二组。
egrep '(server\.[0-9])' config # 提取server.x格式内容
- 次数限定:
*
:任意次(如ab*c
匹配 ac、abc、abbbc)。+
:至少 1 次(如ab+c
匹配 abc、abbbc)。{m,n}
:m 到 n 次(如ab{2,4}c
匹配 abbbc)。
四、扩展正则与应用
1. 特殊字符集
- 预定义字符集:
[:alnum:]
:字母 + 数字,[:digit:]
:数字,[:lower:]
:小写字母。
- 示例:
grep "[[:digit:]]{3}" file # 匹配3位数字
2. 实际应用场景
- IP 地址验证:
egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' ip.txt # 简单IP格式匹配
- 网址验证:
egrep '^http(s)?://[a-z0-9]+\.[a-z]{2,5}$' url.txt
- 手机号 / 邮箱验证:
egrep '^1[3-9][0-9]{9}$' phone.txt # 手机号格式 egrep '^[a-z]+@[a-z]+\.[a-z]{2,5}$' email.txt # 邮箱格式
五、自动化检测脚本
核心逻辑:
- 定义正则表达式验证输入格式(IP、网址、手机号等)。
- 使用
expect
或shell
命令(如ping
、curl
)检测目标存活。 - 示例功能:
- 主机存活检测:
ping -c1 -W1 IP
。 - 网站可用性检测:
curl -s -o /dev/null URL
。
- 主机存活检测: