学习笔记

监控取值
=============================================
#提取当前日期 
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"

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注