shell脚本进阶

一、shell常用技巧

1.1 随机获取8位数字

echo $RANDOM | cksum | cut -c 1-8

openssl rand -base64 4 | cksum | cut -c 1-8

date +%N | cut -c 1-8

1.2 grep 统计查找条数

#grep  -v 不显示该条件,-c统计查找条数。

grep -vc grep

1.3 shell脚本命令行调用变量,

需要用 "'""'" 这样。如果在外面可以用 "'$var'"

awk '{print"输出:'"$var"'",$1}'

1.4 echo 扩展

# -e 为拓展

echo -e "\n"

二 常用输出颜色

echo -e "\033[36;36m 淡蓝 \033[0m"

echo -e "\033[35;35m 浅紫 \033[0m"

echo -e "\033[34;34m 深蓝 \033[0m"

echo -e "\033[33;33m 深黄 \033[0m"

echo -e "\033[32;32m 深绿 \033[0m"

echo -e "\033[31;31m 红色 \033[0m"

echo -e "\033[30;30m 黑色 \033[0m"

三、常用脚本进阶

3.1 备份单个文件

#!/bin/bash
#备份单个文件
DATE=`/bin/date +%y%m%d`
/bin/tar -czpf /backup/$1.$DATE.tar.gz /backup/$1 >/dev/null
if [ $? -eq 0 ]
then
        echo "$1 备份成功" >> /backup/$1.bak.log
else
        echo "备份$1失败" >> /backup/$1.bak.log
fi

3.2 查找大于10M的文件和目录

#!/bin/bash
ll -h /var/log | awk '$5>10 && $5<10240 {print $5,$9}' > file.txt
cat file.txt

3.3 ping网段内所有的存活主机

#!/bin/bash
#ping网段内所有主机存活
for i in {1..254}
do
if ping -w 1 -c 1 192.168.31.$i | grep "100%" >/dev/null
then
echo "192.168.31.$i  YES!!!"  
else
echo "192.168.31.$i  NO!!!" 
fi
done

3.4 查找前十个404的ip与访问量最多的十个ip

#/bin/bash
#查找前十个404的ip与访问量最多的前十个ip
no=`cat /var/log/httpd/access_log | awk '/404/{print $1}' | sort | uniq -c | sort -nr | head -10 | awk '{print $2}' `
pv=`cat /var/log/httpd/access_log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10 | awk '{print $2}' `
echo "fang wen bu dao URL$no"
echo "zui da fang wen liang $pv"

3.5 算平均值,并以排序形式有规矩的列出

#!/bin/bash
#算平均值,并以排序形式有规矩的列出
cat 1 |awk '{print $1,$2.($3+$4+$5)/3}' >/1.txt 
cat /1.txt  |awk '{print $1," " $2 "  ", $3}' |sort -r    >/fan.txt
sed '1c 班级   姓名     平均分数 ' /fan.txt   >/fan 
cat /fan.txt

3.6 ssh密码被尝试10次以上就禁用此ip

#!/bin/bash
#ssh密码被尝试十次以上就禁用此ip
ip=`cat /var/log/secure | awk '/^Apr/{print $4}' | sort | uniq -c |sort -nr | head -1 | awk '{print $2}' `
pv=`cat /var/log/secure | awk '/^Apr/{print $4}' | sort | uniq -c |sort -nr | head -1 | awk '{print $1}'`
if [ $pv -gt 10 ];then
iptables -A INPUT -s $pv -p tcp --dport 22 -j DROP
echo "yi lan jie $ip "
else
echo "ok !"
fi

3.7 修改网卡配置文件内的ip与子网掩码

#/bin/bash
A=`awk -F\= '/^IPADDR/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0`
B=`awk -F\= '/^NETMASK/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0`
sed -i '/^IPADDR/s/'$A'/'$1'/' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i '/^NETMASK/s/'$B'/'$2'/' /etc/sysconfig/network-scripts/ifcfg-eth0
#!/bin/sh
read -p "input" ip
grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 &>/dev/null
if [ $? -gt 0 ]
then
echo "IPADDR=$ip " >> /etc/sysconfig/network-scripts/ifcfg-eth0
else
sed -i '/IPADDR/d' /etc/sysconfig/network-scripts/ifcfg-eth0
echo "IPADDR=$ip " >>/etc/sysconfig/network-scripts/ifcfg-eth0
fi

四、脚本进阶

4.1 查询系统基础情况脚本(system_check.sh)

#!/bin/bash
# 系统状态查询脚本
# 输出系统基本信息
#
# 系统版本 
SYSTEM_VERSION=`cat /etc/redhat-release`
# 主机名
HOSTNAME=`hostname`
# 网卡名称
DEV="ens32"
# IP地址
IP_ADDR=`ifconfig $DEV | grep -v inet6 | grep inet | awk '{print $2}'`
# MAC地址
MAC_ADDR=`ifconfig $DEV  | awk '/ether/{print $2}'`
# 内核版本
KERNEL_VERSION=`uname -a | awk '{print $3}'`
# CPU版本
CPU_VERSION=`cat /proc/cpuinfo | grep -n '^model name' | awk -F":" '{print $3 }'|sed 's/^ //g'`
# 当前时间
DATE=`date`
# 启动时间
DATE_START=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"`
#
echo -e "\n+---------  $DATE  --------+\n"
echo -e "主机名:\n$HOSTNAME\n"
echo -e "系统版本:\n$SYSTEM_VERSION\n"
echo -e "内核版本:\n$KERNEL_VERSION\n"
echo -e "CPU版本:\n$CPU_VERSION\n"
echo -e "系统IP:\n$DEV $IP_ADDR\n"
echo -e "系统MAC:\n$DEV $MAC_ADDR\n"
echo -e "启动时间:\n$DATE_START\n"
#---------------------------
# 系统负载
# uptime
#---------------------------
CPU_NUM=`cat /proc/cpuinfo | grep processor | awk -F":" '{print $2}' | wc -l`
Load=`uptime | awk -F"average:" '{print $2}' | awk -F"," '{print "<__  系统负载  __>  -->  ""CPU数量:'"$CPU_NUM"'""\t1分钟:"$1"\t5分钟:"$2"\t15分钟:"$3}'`
echo -e "\n$Load\n"
#---------------------------
# CPU状态
# vmstat
#---------------------------
CPU_CHECK=`vmstat | awk '{print NR $0}' | awk '/^3/{print "<__  CPU状态   __>  -->  ""CPU使用:"$14"%\t""CPU空闲:"$16"%"}'`
echo -e "$CPU_CHECK\n"
#---------------------------
# 内存状态
# free
#---------------------------
MEMORY=`free -mh | awk ' /^Mem/{print "<__  内存状态  __>  -->  ""内存总量:"$2"\t已用内存:"$3"\t剩余内存:"$4"\t可用内存:"$7}'`
echo -e "$MEMORY\n"
#--------------------------
# 磁盘使用
# df
#--------------------------
DISK=`df -h | grep -n '/$' | awk '{print "<__  磁盘使用  __>  -->  ""磁盘容量:"$2"\t已用容量:"$3"\t可用容量:"$4}'`
echo -e "$DISK\n"
#---------------------------
# 进程统计
# top
#---------------------------
PROCESS=`top -bn1 | awk '/Tasks:/{print $0}' | awk '{print "<__  进程统计  __>  -->  ""进程总数:"$2"\t运行进程:"$4"\t休眠进程:"$6"\t停止进程:"$8"\t僵尸进程:"$10}'`
echo -e "$PROCESS\n"
#---------------------------
# 磁盘IO使用情况
# sar
#---------------------------
IO=`sar -b | grep -n '^[^0-9]' | awk '{print NR $0}'| awk '/^2/{print"<__  磁盘读写  __>  -->  ""读/秒:"$5" bytes""\t写/秒:"$6" bytes"}'`
echo -e "$IO\n"
#---------------------------
# 网卡流量使用情况
# sar
#---------------------------
NETWORK=`sar -n DEV | grep $DEV | grep -n '^[^0-9]'|  awk '{print "<__  网卡流量  __>  -->  ""网卡名:"$2"\t收包/秒:"$3"\t发包/秒:"$4"\t下载/秒:"$5" Bytes""   上传/秒:"$6" Bytes"}'`
echo -e "$NETWORK\n"

4.2 查看目录下包含子目录的所有指定静态文件,测试响应请求时间(request.sh

#!/bin/bash
# Nginx代理访问
#Dname="http://192.168.1.10:8081"
# Tomcat代理访问
Dname="http://192.168.1.10:8080"
# 指定目录
DIR="/upload/"
function request(){
  list=`ls $DIR`
  cd $DIR
  for i in $list;do
    if test -d $i;then
       DIR=$i
       request $DIR
    else
       if echo $i | grep .png >/dev/null 2>&1 || echo $i | grep .jpg >/dev/null 2>&1;then
          Fname=$i
          URL=`pwd`
          # 求出静态文件响应时间
          Total=`curl -o /dev/null -s -w '%{time_total}\n' $Dname$URL/$Fname`
          # 求出文件大小
          Filesize=`du -sh $URL/$Fname 2>/dev/null | awk -F' ' '{print $1}'`
          echo -e "资源URL:$URL/$Fname 大小:$Filesize 响应时间:\033[31;31m$Total\033[0m"
       fi
    fi
  done
  cd ../
}
request $DIR

五、shell正则表达式

5.1 常用字符

字符

解释

“^n”

#带表以什么开头

“n$”

#代表以什么结尾

“^$”

#代表空格

“.”

#.代表左右吻合的任意一个字符如(r.t:root,rwwt)

“*”

#*代表0个或多个任意一个字符。也可以用\?一个意思0个或一个

“.*”

#代表包含左右都有并全部包含的如。(root,rootrsst)

“字母\[3\]”

#代表过滤次数。3代表次数

[^m]

#非m的字符

+

 #匹配+前字符1次或多次

文章来源:Shell 实践、常用脚本进阶 - kevin.Xiang - 博客园 (cnblogs.com)

你可能感兴趣的:(shell脚本编程,linux,服务器,运维)