[知识] 常用的正则表达式

符号  解释
.     代表一个任意字符,除了换行符
*     代表任意多个字符(注意:它无法单独使用,要么和一个字符连用,要么和 "." 连用)
^     代表以它后面的那一个字符开头
$     代表以它前面的那一个字符结尾
+     代表前面的字符出现一次或者多次
?     代表前面的字符出现零次或者多次
{}    代表指定前一个字符出现的次数(例:{n,m} 则是指定出现 n 到 m 次,{n} 则是指定 n 次,{n,} 则是指定 n 到无限次)
[]    代表里面的东西是一个整体,相当于一个字符(例:[0-9] 则是指 [0-9] 中任意一个数,[a-z] 则是指 26 个小写字母中的一个)
[^]   代表里面的东西是一个整体且取反(例:[^0-9] 则是指不包含 [0-9] 中任意一个数字)
|     代表或(例:'a|b' 则是指包含 a 或 b)
\b   代表指定一个字符边界,即字与空格间的位置

常用的正则表达式用法
用法     解释 
[a-z]  匹配小写字母字符从 a 到 z
[^a-z] 匹配小写字母字符没有从 a 到 z
\d     匹配一个数字字符。等价于 [0-9]。grep 命令要加上 -P 才能使用这个正则
\D     匹配一个非数字字符。等价于 [^0-9]。grep 命令要加上 -P 才能使用这个正则
\s     匹配任何不可见字符,包括空格、制表符、换页符等。等价于 [ \f\n\r\t\v]
\S    匹配任何可见字符。等价于 [^ \f\n\r\t\v]
\w    匹配包括下划线的任何单词字符。类似但不等价于 “[A-Za-z0-9_]”,这里的”单词”字符使用 Unicode 字符集
\W    匹配任何非单词字符。等价于 “[^A-Za-z0-9_]”

[工具] Shell 批量克隆 KVM 虚拟机

注意:在克隆 KVM 虚拟机之前要先安装 KVM 、创建 KVM 虚拟网络和 KVM 模板机

正文:

#!/bin/bash
#作者:朱明宇
#名称:批量克隆 KVM 虚拟机
#作用:批量克隆 KVM 虚拟机
#使用方法:
#1.在此脚本的分割线内写入相应的内容
#2.给此脚本增加执行权限
#3.执行此脚本
#注意:
#1.在执行此脚本之前要先安装 KVM
#2.在执行此脚本之前要先准备好模板机的硬盘文件和 xml 文件
#3.请以 root 的权限执行次脚本

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

templatedisk="/var/lib/libvirt/images/template_centos_7_10g.qcow2" #模板机硬盘文件目录
templatexml="/etc/libvirt/qemu/template_centos_7_10g.xml" #模板机 xml 文件目录
templatename="template_centos_7_10g" #模板及在 KVM 域中的名称

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

sudo systemctl start libvirtd
if [ $? -ne 0 ];then
	echo -e "\033[31m你没有安装 KVM 或者你没有以 root 权限执行次脚本,脚本无法执行\033[0m"
	exit
fi

sudo virsh desctroy $templatename &> /dev/null
sudo virt-sysprep -d $templatename &> /dev/null

read -p "将要克隆虚拟机,单独克隆一台请输入 1,批量克隆请输入任意其他字符 " cloneway
if [ ! $cloneway ];then
	echo -e "\033[31m你没有输入任何值,立刻推出"
	exit
fi

if [ $cloneway == 1 ];then
	read -p "要克隆产生的主机名称,没有默认值必须输入一个 " onename
	read -p "要克隆产生的主机处理器个数,请只输入整数,最小为 1,单位个,直接回车则是使用默认值 2 " cpu
	read -p "要克隆产生的主机内存大小,请只输入数字,单位 G,直接回车则是使用默认值 2 " mem
	read -p "要克隆产生的主机硬盘大小,请只输入数字,单位 G,直接回车则是使用默认值 10 " disk
        if [ ! $onename ];then
		echo -e "\033[31m你没有输入要克隆产生的主机名,停止克隆\033[0m"
		exit
	fi
	sudo virsh list --all | egrep -w $onename
	if [ $? -eq 0 ];then
		echo -e "\033[31m$onename 这个要克隆产生的主机名已经存在了,停止克隆\033[0m"
		exit
	fi
else
	read -p "要批量克隆产生的主机名称的前缀名称,没有默认值必须输入一个 " name
	read -p "要批量克隆产生的主机名后缀起始编号,没有默认值必须输入一个,请只输入数字 " snum
	read -p "要批量克隆产生的主机名后缀结束编号,没有默认值必须输入一个,请只输入数字 " enum
	read -p "要批量克隆产生的主机处理器个数,请只输入整数,最小为 1,单位个,直接回车则是使用默认值 2 " cpu
	read -p "要批量克隆产生的主机内存大小,请只输入数字,单位 G,直接回车则是使用默认值 2 " mem
	read -p "要批量克隆产生的主机硬盘大小,请只输入数字,单位G,直接回车则是使用默认值 10 " disk
	if [ ! $name ];then
	        echo -e "\033[31m你没有输入要批量克隆产生的主机名称前缀,停止克隆\033[0m"
	        exit
	fi
	if [ ! $snum ];then
	        echo -e "\033[31m你没有输入要批量克隆产生的主机名后缀起始编号,停止克隆\033[0m"
                exit
        fi
	if [ ! $name ];then
	        echo -e "\033[31m你没有输入要批量克隆产生的主机名后缀结束编号,停止克隆\033[0m"
        fi

	let snum+0 > /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[31m你输入的要批量克隆产生的主机名后缀起始编号不是数字,无法克隆\033[0m"
        exit
	fi
	snum=${snum%%.*}

	let enum+0 > /dev/null
	if [ $? -ne 0 ];then
		echo "\033[31m你输入的要批量克隆产生的主机名后缀结束编号不是数字,无法克隆\033[0m"
		exit
	fi
	enum=${enum%%.*}

	for i in `seq $snum $enum`
	do
	sudo virsh list --all | egrep -w $name$i
	if [ $? -eq 0 ];then
		echo -e "\033[33m$name$i 这个要克隆产生的主机名已经存在了,将跳过不克隆它\033[0m"
	fi
        done
fi

if [ ! $cpu ];then
	cpu=2
else
	let cpu=cpu+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo "你输入的处理器个数不是数字,无法克隆"
		exit
	fi
	if [ $cpu -le 1 ];then
		cpu=1
	fi
	cpu=${cpu%%.*}
fi

if [ ! $mem ];then
	mem=2097152
else
	let mem=mem+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo "你输入的内存大小不是数字,无法克隆"
		exit
	fi
	if [ $mem -le 524288 ];then
		mem=524288
	fi
fi

if [ ! $disk ];then
	disk=10
else

	let disk=disk+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo "你输入的硬盘大小不是数字,无法克隆"
		exit
	fi
	if [ $disk -le 10 ];then
		disk=10
	fi
fi

if [ $cloneway -eq 1 ];then
	sudo qemu-img create -f qcow2 -b $templatedisk /var/lib/libvirt/images/$onename.img ${disk}G &> /dev/null
	sudo cp $templatexml /etc/libvirt/qemu/$onename.xml
	sudo sed -i "/uuid/d" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "/mac address/d" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "s:<name>.*</name>:<name>$onename</name>:" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "s:<source file=.*/>:<source file=\'/var/lib/libvirt/images/$onename.img\'/>:" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "s:<vcpu placement='static'>.*</vcpu>:<vcpu placement='static'>$cpu</vcpu>:" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "s:.*</memory>:<memory unit='KB'>$mem</memory>:" /etc/libvirt/qemu/$onename.xml
	sudo sed -i "s:.*</currentMemory>:<currentMemory unit='KB'>$mem</currentMemory>:" /etc/libvirt/qemu/$onename.xml
	sudo virsh define /etc/libvirt/qemu/$onename.xml &> /dev/null
        sudo virsh start $onename &> /dev/null
	sudo virsh list --all
else
	for i in `seq $snum $enum`
	do
		sudo qemu-img create -f qcow2 -b $templatedisk /var/lib/libvirt/images/$name$i.img $[disk]G &> /dev/null
		sudo cp $templatexml /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "/uuid/d" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "/mac address/d" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "s:<name>.*</name>:<name>$name$i</name>:" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "s:<source file=.*/>:<source file=\'/var/lib/libvirt/images/$name$i.img\'/>:" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "s:<vcpu placement='static'>.*</vcpu>:<vcpu placement='static'>$cpu</vcpu>:" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "s:.*</memory>:<memory unit='KB'>$mem</memory>:" /etc/libvirt/qemu/$name$i.xml
		sudo sed -i "s:.*</currentMemory>:<currentMemory unit='KB'>$mem</currentMemory>:" /etc/libvirt/qemu/$name$i.xml
	        sudo virsh define /etc/libvirt/qemu/$name$i.xml &> /dev/null
                sudo virsh start $name$i &> /dev/null
      done
      sudo virsh list --all
fi

[工具] Shell 批量检测服务器网络的联通状态

#!/bin/bash
#作者:朱明宇
#名称:随机点名
#作用:在一列名单中随机选出一个名字
#使用方法:
#1.将此脚本和清单 servers_all_list.txt 文件放在同一目录下,每一个名字占用一行
#2.给此脚本增加执行权限
#3.执行此脚本

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

list="servers_all_list.txt" #解释:指定服务器清单的目录和名称

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

read -p "will ping please input y " a
echo $a
if [ "$a" != "y" ];then
echo "you don't agree so exit now"
exit
fi

num=0
for i in `awk '{print $1}' servers_all_list.txt`
do
let num++
echo "$num $i"
ping -c3 -i0.4 -w0.8 $i
echo
done

补充:清单示例如下(可直接复制粘贴,如果不更改脚本,清单请命名为 servers_all_list.txt):

db1
db2
db3
web1
web2

[工具] Shell 批量检查域名的 DNS 解析是否正确

#!/bin/bash
#作者:朱明宇
#名称:批量检查域名的 DNS 解析是否正确
#作用:批量检查域名的 DNS 解析是否正确
#使用方法:
#1.在此脚本的分割线内写入相应的内容
#2.给此脚本增加执行权限
#3.执行此脚本

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

main_domain=eternalcenter.com #此处填写网站的“主域名”,网站一般会有几个域名,其中“主域名”直接指向 ip 地址,其他的域名都指向主域名
ip=144.48.142.148 #域名指向的 ip 地址
nginx=1.16.0 #web 程序的对应版本的版本
content1="永恒中心" # 随即填写一个具有代表性的网站首页的内容
content2="朱明宇的" # 随即填写一个具有代表性的网站首页的内容,但是要和前面的 content1 在同一行
domain="eternalcenter.com eternalcentre.com zhumingyu.com mingyuzhu.com eternalcenter.org eternalcentre.org" #需要检测的域名

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

check_domain_name(){
if [ $1 == $main_domain ];then
	
	ping -c4 -i0.4 $1 | grep $ip &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[31m $1 is error !!!!! ip is error !!!!! \033[0m"
	else
		curl $1 | grep $nginx &> /dev/null
		if [ $? -ne 0 ];then
			echo -e "\033[31m $1 is error !!!!! software is error !!!!! \033[0m"
		else	
			elinks $1 | grep "$content1" | grep "$content2" &> /dev/null
			if [ $? -ne 0 ];then
				echo -e "\033[31m $1 is error !!!!! web is error !!!!! \033[0m"
			else
				echo -e "\033[32m $1 is ok \033[0m"
			fi
		fi
		
	fi
else
	elinks $1 | grep "$content1" | grep "$content2" &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[31m $1 is error !!!!! web is error !!!!! \033[0m"
	else
		echo -e "\033[32m $1 is ok \033[0m"
	fi


fi
}

for i in $domain
do
	check_domain_name $i
done

[工具] Shell 监控当前服务器的重要指标状况(例如:剩余硬盘空间、内存空间等)

#!/bin/bash
#名称:监控当前服务器的重要指标状况(例如:剩余硬盘空间、内存空间等)
#作用:监控当前服务器的重要指标状况(例如:剩余硬盘空间、内存空间等)
#使用方法:
#1.给此脚本增加执行权限
#2.执行此脚本

ip=`ip a s | awk '/noprefixroute ens33/{print $2}'` #ip
host=`hostname` #被监控服务器的服务器名
disk=`df -h | awk '/\/$/{print $5}'` #被监控服务器的剩余硬盘空间
mem=`free -m | awk '/Mem/{print $4}'` #被监控服务器的剩余内存空间
cpu=`top -bn 1 | awk -F',' '/^%Cpu/{print $4 }' | awk '{print $1}'` #被监控服务器的处理器剩余率
soft=`rpm -qa | wc -l` #被监控服务器所安装的软件数量
port=`ss -ntulap | wc -l` #被监控服务器所开启的端口号


echo "$ip $host disk $disk"
echo "$ip $host mem $mem"
echo "$ip $host cpu $cpu"
echo "$ip $host soft $soft"
echo "$ip $host port $port"
echo