自己学习的一些shell脚本,做个总结,不断提高自己的脚本能力,不断地添加,不断地温故而知新
1.批量修改文件名称
首先伪造Y一批文件:
touch dingyawu_{1..5}_finished.jpg
修改文件名称:
for file_name in `ls *_finished.png*`;do mv $file_name ${file_name//_finished/}; done;
2.统计加法
1. echo {1..100} | tr " " "+" | bc
2. echo $((`seq -s "+" 100`))
3. seq -s " + " 100 | xargs expr
3.创建文件夹
test -e "hello.txt" && echo "该文件已存在,不需要重复创建了" || mkdir hello.txt
4.通过位置变量创建linux系统账户及密码
#!/bin/bash
`useradd $1`
echo "$2" |passwd --stdin "$1"
5判断进程是否在执行
#!/bin/bash
num=$(ps -ef |grep $1 |grep -vc grep)
if [ $num -eq 1 ]
then echo "$1 running."
else
echo "$1 is not running!"
fi
6. 动态定义文件名
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
7. 遍历文件夹
for file in /home/rich/test/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
8.一键查看服务器利用率
CPU top,vmstat
内存
硬盘
TCP连接状态
重点关注 us,sy, id, wa
total = used + avaliable
#! /bin/bash
function cpu(){
util=$(vmstat | awk '{if(NR==3)print $13+$14}')
iowait=$(vmstat | awk '{if(NR==3)print $16}')
echo "cpu使用率:${util}, 等待磁盘IO响应使用率: ${iowait}"
}
function mem(){
total=$(free -m | awk '{if(NR==2)printf "%.1f", $2/1024}')
used=$(free -m | awk '{if(NR==2)printf "%.1f", ($2-$NF)/1024}')
ava=$(free -m | awk '{if(NR==2)printf "%.1f", $NF/1024}')
echo "内存总大小:${total}, 已使用: ${used} , 剩余:${ava}"
}
function disk(){
ff=$(df -h | awk '/^\/dev/{print $1}')
for p in $ff; do
mounted=$(df -h | awk -v p=$p '$1==p{print $NF}')
size=$(df -h | awk -v p=$p '$1==p{print $2}')
used=$(df -h | awk -v p=$p '$1==p{print $3}')
used_percent=$(df -h | awk -v p=$p '$1==p{print $5}')
echo "硬盘-挂载点: ${mounted}, 总大小:${size}, 已使用:${used}, 使用率:${used_percent}"
done
}
function tcp_status(){
summary=$(netstat -antp | awk '{a[$6]++}END{for( i in a)printf i ":" a[i] " "}')
echo "TCP连接状态:${summary}"
}
cpu
mem
disk
tcp_status
9. 找出占用CPU、内存过高的进程
#! /bin/bash
echo "找出占用CPU、内存过高的进程"
echo "--------------cpu top 10 ------------------"
ps -eo pid,pcpu,pmem,args --sort=-pcpu | head -n 10
echo "--------------memory top 10 ------------------"
ps -eo pid,pcpu,pmem,args --sort=-pmem | head -n 10
10. 查看网卡的实时流量
ifconfig 查看网卡的信息
cat /proc/net/dev
awk '0~"eth0" {print 2}' /proc/net/dev
使用$0表示使用所有域, =、~匹配正则表达式、!~不匹配正则表达式
查看接受的流量和发出的流量
#! /bin/bash
NIC=$1
echo -e "in ----------- out"
while true;do
OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
sleep 1
NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
IN=$(printf "%.1f%s" "$((($NEW_IN - $OLD_IN)/1024))" "KB/s")
OUT=$(printf "%.1f%s" "$((($NEW_OUT - $OLD_OUT)/1024))" "KB/s")
echo "$IN $OUT"
done
11. 批量检查网站是否正常
#! /bin/bash
# 批量检查网站是否正常
URL_LIST="www.baidu.com www.ctnrs.com"
for URL in URL_LIST; do
FAIL_COUNT=0
for ((i=1;i<=3;i++)); do
HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
if [ $HTTP_CODE -eq 200 ]; then
echo "$URL ok"
break
else
echo "retry $FAIL_COUNT"
let FAIL_COUNT++
fi
done
if [ $FAIL_COUNT -eq 3 ]; then
echo "warning: $URL access failure"
fi
done
12. 自动登录服务器的脚本
sh connect.sh (df -h)
#! /bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
USER=$(awk -vip=$IP 'ip==$1{print $2}' $HOST_INFO)
PORT=$(awk -vip=$IP 'ip==$1{print $3}' $HOST_INFO)
PASS=$(awk -vip=$IP 'ip==$1{print $4}' $HOST_INFO)
expect << EOF
set timeout 30
spawn ssh -p $PORT $USER@$IP
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send $PASS\r"}
}
expect "$USER@*" {send "$1\r"}
expect "$USER@*" {send "exit\r"}
EOF
done
12. nginx 日志监控脚本
#! /bin/bash
#日志格式 :
LOG_FILE=$1
echo "统计访问最多的10个IP"
awk '{a[$1]++}END{print "PV:", length(a);for(v in a); print v, a[v]}' $LOG_FILE | sort -k2 -nr | head -n 10
echo "-------------------"
echo "统计时间段访问最多的IP"
awk '$4>="[01/Jan/2023:14:26:51" && $4<="[10/Jan/2023:14:26:51" {a[$1]++}END{for(v in a)print v, a[v]}' $LOG_FILE | sort -k2 -nr | head -n 10
echo "-------------------"
echo "统计访问最多的10个页面"
awk '{a[$7]++}END{print "UV:", length(a); for(v in a){if(a[v]>10)print v, a[v]}}' $LOG_FILE | sort -k2 -nr | head -n 10
echo "统计访问页面状态码数量"
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v, a[v]}}' $LOG_FILE | sort -k3 -nr
12. nginx 日志防止DDOS攻击
#! /bin/bash
DATE=$(date +"%d/%b/%Y:%H:%M")
NGINX_FILE=/usr/local/nginx/logs/access.log
ABNORMAL_IP=$(tail -n 50000 $NGINX_FILE | grep $DATE | awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL | grep -c $IP) -eq 0 ]; then
iptables -I INPUT -s $IP -j DROP
echo "$(date + '%F_%T') $IP" >> /tmp/drop_ip.log
fi
done