监控取值
=============================================
#提取当前日期
today=`date -d "0 day" +%Y年%m月%d日%H:%M`
today=`date -d "0 day" +%Y-%m-%d--%H:%M:%S`
2021年09月28日10:54
#提取本服务器的IP地址信息
IP=`ifconfig eth0 | grep "inet "|awk '{print $2}'`
#提取服务器内存信息
usedMemP=$(free | awk '/Mem/{printf("%.2f%\n"), $3/$2*100}' | sed "s/\..*//g")
#提取服务器磁盘信息
result=$(df -Ph | grep -v Filesystem | grep -v 文件系统 | awk '{print $5,$6}' | awk -F "%" '{if($1>=strtonum("'${max_percent}'")){print $2,$1"%"}}'):
#取当前空闲cpu百份比值(只取整数部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}' | cut -f 1 -d "."`
usedCpuP=`top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
usedCpuP=$(top -b -n 2 -d 0.02 | grep Cpu | tail -n 1 | awk '{print $2}' | cut -f 1 -d "%" | sed "s/\..*//g")
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
if (($cpu_idle < 20)); then
echo "IP为 $IP 的腾讯云服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警" 13330295142@163.com
fi
TOKEN="https://oapi.dingtalk.com/robot/send?access_token=Token"
if [ $days -lt 60 ]; then
#去掉file的后缀crt
curl ${TOKEN} -H 'Content-Type: application/json' -X POST --data '{"msgtype":"text","text":{"content":"告警域名:'${file%.crt}',SSL证书有效期剩余:'$days' 天!注意提前续签更新证书!"} , "at": {"isAtAll": true}}'
fi
##################批量添加计划任务##################
ssh root@192.168.98.170 "(echo '16 4 * * * sh /home/script/a.sh > /home/script/a.log 2>&1' ;crontab -l )|crontab"
=============================================
正则表达式元字符
=============================================
^ 行首定位符 ^love
$ 行尾定位符 love$
. 匹配单个字符 l..e
* 匹配前导符0到多次 ab*love
.* 任意多个字符
[] 匹配指定范围内的一个字符 [IL]ove<s
[-] 匹配指定范围内的一个字符 [a-z0-9]ove
[^] 匹配不在指定组内的字符 [^a0z0-9]obe
\ 用来转译元字符 love\.
\< 词首定位符 \<love
\> 词尾定位符 love\>
\> 词尾定位符 love\>
\(..\) 匹配稍后使用的字符的标签 :% s/\(172.16.130.\)1/\15/
x\{m\} 字符x重复出现m次 o\{5\} grep 'o\{5\}' u.txt
x\{m,\} 字符x重复出现m次以上 o\{5,\}
x\{m,n\}字符x重复出现m次以上 o\{5,10\}
=============================================
$ openssl pkcs7 -inform der -in rtm.faw-vw.com.p7b -out rtm.faw-vw.com.p7bcc.p7b
openssl pkcs7 -print_certs -in rtm.faw-vw.com.p7b.p7b -out safaricom_b2c_readable.cer
openssl pkcs7 -print_certs -in rtm.faw-vw.com.p7b -out safaricom_b2c_readable.cer
---------------------vim---------------------
将root替换为rm
:%s /root/rm/g
正则表达式将Tom替换为David
1,$ s/\<[Tt]om\>/David/g
将10.18.40.100替换为10.18.40.200
:%s/\(10.18.40.\)100/\1200/
:%s#\(10.18.40\).100#\1.200#
替换ip
:%s#\(10.\)\(18.\)\(40.\)100#\1\2\3200#
注释文本加#
:3,9 s/\(.*\)#\1/
---------------------vim---------------------
---------------------sed---------------------
sed 's/root/rm/' passwd
s替换root搜索字符rm替换的字符 passwd修改的文件/是分隔符
sed 's_/bin/bash_/sbin/nologin_' b.txt (分隔符随意)
sed 's/\/bin\/bash/\/sbin\/nologin/' b.txt(分隔符随意)
sed 's/root/(&)/' passwd (匹配的字符中添加())
sed 's/root/rm/g' /g 替换所有
sed -e '3,5s/nologin/bash/' -e '9,11s/sbin/bin/' passwd (同时替换多个内容用-e)
-e 替换多个
systemctl status prometheus|sed -n '3p' 显示输出命令的第三行并打印(p 打印)
systemctl status prometheus|sed -n '1,3!p' 显示文件除前三行之外的全部内容
systemctl status prometheus|sed -n '3,+3p' 显示文件指定行和之后指定行的内容
sed -n '3p' passwd (显示文件第三行到屏幕中)
sed -n '1,3p' passwd (显示文件第一到第三行到屏幕中)
sed '1i####' passwd (在指定行后插入内容)在文件开头进行插入 i在文件匹配之前插入
sed '$a1111' 9.txt 在文件末尾插入内容1111 a在文件匹配之后插入
sed -n '99,p' test.txt 使用sed打印第99行
---------------------sed---------------------
history|awk -F " " '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}'
sj=`date`
ping -c1 -W1 www.baidu.com |grep from |awk '{print $1,$2,$3,$4,$5,$6,$7,$8,"'"$sj"'"}'
---------------------awk---------------------
awk 'BEGIN{print 2/5} {print"ok"} END{print "ok"}' /etc/passwd 三段式输出 begin开始输出,内存输出,end结束输出
date |awk '{print "month:",$2 "\nyear" $NF}' 格式化打印
awk 中引用shell变量需要用"'"$ip"'"
####查看日志
cat rtm_ass.log |egrep "^49.4.25.85|^49.4.25.152" |awk '{print $1,$4,$5,$7,$9,$10,$17,$20,$22,$NF}' |grep '/prod/tm/ocu/ocuData'|grep '08/Sep/2021' |wc -l
awk -F':' '{printf"%-15s %-10s %-15s\n",$1,$2,$3}' /etc/passwd 格式化输出换行
%s 字符类型
%d 数值类型
%f
-表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
ip addr |egrep '\<inet\>'|grep -v '127.0.0.1'|awk '{print $2}'|awk -F'/' '{print $1}'
echo "$name-`ip addr |egrep '\<inet\>'|grep -v '127.0.0.1'|awk '{print $2}'|awk -F'/' '{print $1}'`"
name="elastic"
echo "$name-`ip addr |egrep '\<inet\>'|grep -v '127.0.0.1'|awk '{print $2}'|awk -F'/' '{print $1}'`" |tee /etc/hostname
cat 1 |awk 'BEGIN{RS=":"}{print $0}' RS将一行按照分隔符分成多行。
1111 2222 3333 4444
5555
666
awk -F: '{if($3<300){print $0}else{print $0}}' /etc/passwd awk if判断
---------------------awk---------------------
打开文件句柄 exec6 <>/file1
关闭文件句柄 exec 6<&-
查看句柄 ll /proc/$$/fd
把删除句柄拷贝成为文件 cp /proc/$$/fd/6 /file1
当一个文件的FD未被释放删除原文件也不会影响FD
{}& 后台运行进程
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
#显示上一条命令的返回值
echo $?
---------------------grep---------------------
ip addr |egrep -o '[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' (只显示匹配的内容)
cat 1.txt |grep -v '^$' 过滤空行
---------------------grep---------------------
##########################################################
while 语句结构
while条件测试
do
循环体
done
==当条件测试成立(条件测试为真)
until 语句结构
until条件测试
do
循环体
done
==当条件测试成立(条件测试为假)
#####################时间################################
cp -rp prometheus.yml prometheus.yml`date "+%y-%m-%d-%H-%M"`
#####################时间################################
#!/usr/bin/bash
read ip
if ping -c1 $ip &</dev/null ;then
echo "$ip is butong"
else
echo "$ip is tong"
fi
--------------------------------
#!/usr/bin/bash
ip=192.168.1.1
ping -c1 $ip >/dev/null;
if [ $? eq 0] ;then
echo "$ip is butong"
else
echo "$ip is tong"
fi
export ip 1.1.1.1
--------------------------------
弹性 MapReduce
--web.listen-address=":9700"
emr-84zq57g5
############拷贝密钥#################
#!/usr/bin/bash
ip="
192.168.98.170
"
passwd=123456
for i in $ip
do
/usr/bin/expect <<EOF
spawn ssh-copy-id $i
expect {
"yes/no" { send "yes\r"; exp_continue }
"*password" { send "$passwd\n"; exp_continue }
{ send "\n"}
}
EOF
done
###########################多重定义引用###########################
status_1=$(echo -n "$i 状态为" `ssh root@$i " systemctl status elasticsearch.service|grep Active"`)
--------------------------------
#!/usr/bin/bash
JC=`ps -ef |grep -v grep |grep rabbitmq |awk '{print $2}'`
JCS=`ps -ef |grep rabbitmq |wc -l`
if [ "$JCS" -ne 5 ] ;then
for line in $JC
do
kill -9 $line
echo $line;
done
systemctl start rabbitmq ;
else
exit;
fi
-------------跨脚本调用函数-------------------
#!/usr/bin/bash
source ./pubilc.sh
source ./2.sh
echo "$dir_path"
echo "ip is $ip "
echo "$ip2"
$# 没加参数
$? 上一个参数返回值
ctrl +u 重新输入
ctrl +backspance 删除错误内容
数字1左面的符号是分号用于进行执行命令
#bash -vx 开启调试模式运行命令
#!/usr/bin/bash
ip=192.168.98.135
i=1
while [ $i -le 5 ]
#i的值小于等于5
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip"
fi
let i++
done
######################################################
#判断变量是否为空
#!/bin/sh
para1=
if [ ! -n "$para1" ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi
######################################################
${#line} -eq 0 判断空行
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个进程的PID
$? 上一个命令的返回值0表示成功
######################################################
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
-o:or
-a:and
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
##########输出日期#############
yml_dir="/usr/local/prometheus/"
yml_file="/usr/local/prometheus/prometheus.yml"
cp -rp $yml_file "$yml_dir"prometheus.yml.`date "+%y-%m-%d"`
###########shell判断###########
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
#如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
mkdir /myfolder
fi
seq 序列
[root@localhost ~]# seq 3
1
2
3
[root@localhost ~]# seq -f "stu%3g" 3
stu 1
stu 2
stu 3
[root@localhost ~]# seq -f "%03g" 3
001
002
003
#############################字符串比较用两个[[]]或者用===#############################
#!/usr/bin/bash
prometheus_status=`systemctl status prometheus |grep Active |awk '{print $3}' `
old_status="(running)"
if [[ $prometheus_status -eq $old_status ]];then
if [ $prometheus_status == $old_status ];then
echo "服务install成功,请通过http://$ip:9090进行访问,程序退出。。。"
exit
else
echo "服务安装失败,请检查。。"
exit
fi
~
cat <<EOF
123
123
1
312
EOF
输入磁盘信息
#!/usr/bin/bash
ip=192.168.1.1
for i in ip
do
ssh $i df -h
done
[root@localhost ~]# seq -f "stu%03g" 3
stu001
stu002
stu003
%前边是固定字符串,%后是数字位数,默认是0
%3g代表三位数字,没有数字用空格代替
%03g代表三位数字,没有数字用0代替
nohup /data/node_exporter/node_exporter --web.listen-address=":19100" &
###############后台执行###############
nohup /var/lib/mesos/mysqlBackup/20210713010103/sqldump.sh &
###############while 添加用户###############
#!/usr/bin/bash
while read line
do
user=`echo $line|awk' {print $1}'`
pass=`echo $line|awk' {print $2}'`
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "user $user already exists"
else
useradd $user
echo "$pass" |passwd --stdin $user &>/dev/null
if [ $? -eq 0 ];then
echo "$user is created."
fi
fi
done < $1
################for获取所有参数################
#!/usr/bin/bash
for i in $@
do
let sum=$sum+$i
done
echo "$sum"
######替换文本#########
sed -ri /^123/c456 1.txt
以^开头 c为替换
#####################################
批量修改mysql密码
#!/usr/bin/bash
#!/usr/bin/expect
ip='
192.168.98.138
192.168.98.157
'
passwd='111111'
for i in $ip
do
/usr/bin/expect <<-EOF
spawn ssh root@$i
expect "*password"
send "123456\n"
expect "#*"
send "mysql -uroot -p123456 -P3306 \n"
send "use mysql; \n"
send "UPDATE user SET Password = PASSWORD('$passwd') WHERE user = 'root';\n"
send "FLUSH PRIVILEGES;\n"
send "exit\n"
expect eof
EOF
done
###############expect发送特殊字符######################
/usr/bin/expect <<-EOF
spawn ssh root@$ip_1
expect "#*"
send "/usr/local/mongodb/bin/mongo --host=$ip_1 --port=27017 \n"
expect "#*"
send "$csh \n"
expect "#*"
send "rs.add(\"192.168.98.158\:27018\") \n"
expect "#*"
send "rs.addArb(\"192.168.98.159\:27019\") \n"
expect "#*"
send "exit \n"
expect eof
EOF
#"号和:号需要进行转译不然会出现报错。
#########################sed读取插入变量############################
#!/usr/bin/bash
read -p "请输入主机:" localhost
read -p "请输入服务名称:" service
read -p "请输入端口名称:" port
sed -ri "1i$localhost $service $port" b.txt
cat b.txt
#########if|elif|else|fi####################################
#!/usr/bin/bash
read -p "123131" input
if [ $input == "y" -o $input == "yes" -o $input == "Y" -o $input == "YES" ];then
echo "内容插入成功"
elif [ $input == "n" -o $input == "no" -o $input == "N" -o $input == "NO" ];then
echo "插入失败"
else
echo "..."
fi
####################################函数####################################(先定义在调用)
#!/bin/bash
factorial() {
factorial=1
for((i=1;i<=$1;i++))
do
factorial=$[$factorial * $i]
done
echo "$factorial"
}
factorial $1
factorial $2
factorial $3
[root@gyx-wrok ~]# ./00.sh 5 8 10
120
40320
3628800
################################return####################################(现在在255数值以内)
#!/bin/bash
fun2() {
read -p "enter num: " num
return $[2*$num]
}
fun2
echo "fun2 return value; $?"
################################函数返回值####################################(无限制)
#!/bin/bash
fun2() {
read -p "enter num: " num
echo $[2*$num]
}
result=`fun2`
#定义变量接收函数变量
echo "fun2 return value; $result"
################################函数位置参数####################################
#!/usr/bin/bash
if [ $# -ne 3 ];then
echo "usage: `basename $0`"
exit
fi
fun2() {
echo "$(($1 * $2 * $3))"
}
result=`fun2 $1 $2 $3`
echo "$result"