循环1-100累加
[root@m01 scripts]# cat 1-100.sh
#!/bin/bash
sum=0
for (( i=1; i<=100; i++ ))
do
((sum+=i))
done
echo $sum
while读取文件部分内容累加
[root@m01 scripts]# cat stu.txt
01 oldbing 18
02 oldxia 19
03 oldlidao 19
04 oldguo 66
[root@m01 scripts]# cat while-stu.sh
#!/bin/bash
sum=0
file=/server/scripts/stu.txt
while read line
do
i=`echo $line | awk '{print $3}'`
((sum+=i))
done <$file
echo $sum
netstat -ant
ss -ant
函数
[root@m01 scripts]# cat 1-15hanshu.sh
#!/bin/bash
print() {
name=$1
echo "${name}今天15号了"
echo "${name}调用函数"
echo "${name}函数执行过程"
echo $0
echo $#
echo $*
}
print {a..z}
###企业案例:写一个Shell脚本解决类DDOS攻击的生产案例。请根据web日志或者或者系统网络连接数,监控当某个IP并发连接数,若短时内并发连接数达到100(阈值),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables -I INPUT -s IP地址 -j DROP。
分析:
1.通过awk分析日志、连接数 每个ip的次数 结果存放在文件中
2.通过while read line 读取文件
1) 判断次数如果大于100 则封掉
```l
#!/bin/bash
file=/server/scripts/netstat.log
tmp_file=/server/scripts/tmp.txt
awk -F'[ :]+' '/ESTABLISHED/{print $6}' $file|sort |uniq -c >$tmp_file
while read line
do
cnt=`echo $line|awk '{print $1}'`
ip=`echo $line|awk '{print $2}'`
if [ $cnt -ge 2 ]
then
iptables -I INPUT -s $ip -j DROP
fi
done <$tmp_file
[root@m01 scripts]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 123.6.8.223 0.0.0.0/0
DROP all -- 123.244.104.42 0.0.0.0/0
DROP all -- 121.204.108.160 0.0.0.0/0
DROP all -- 118.242.18.177 0.0.0.0/0
DROP all -- 114.250.252.127 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2020年 01月 15日 星期三 15:30:24 CST
iptables -F清空防火墙
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件
[root@m01 scripts]# cat sun.sh
#!/bin/bash
dir=/sun/
[ ! -d $dir ] && mkdir -p $dir
for i in `seq 10`
do
touch $dir`echo $RANDOM |md5sum |cut -c 1-10`_sun.html
done
ll /sun
[root@m01 scripts]# date +%N|md5sum|cut -c 1-8
083d6859
[root@m01 scripts]# echo $((RANDOM + 100000000 ))
100018493
删除所有只剩小写字符
批量创建文件(纯字母)
#!/bin/bash
dir=/sun
[ ! -d $dir ] && mkdir -p $dir
for i in `seq 10`
do
name=`tr -cd 'a-zA-Z' </dev/urandom |head -c 10`
touch $dir/${name}_sun.html
done
将创建好的文件名中的sun替换为www
[root@m01 scripts]# cat tihuan.sh
#!/bin/bash
cd /sun
for n in `ls *.html`
do
mv $n ${n/sun/www}
done
批量创建用户
[root@m01 scripts]# cat user.sh
#!/bin/bash
for n in oldboy{01..10}
do
useradd $n
password=`tr -cd 'a-zA-Z' </dev/urandom |head -c8`
echo "$password"|passwd --stdin $n
echo $n $pass >> /root/pass.txt
done
checkpid() {
local i #设置局部变量i
for i in $* ; do #函数所有参数 循环
[ -d "/proc/$i" ] && return 0
done
return 1
}
函数checkpid
checkpid
如果这个pid存在 return 0
[root@manager ~]# . /etc/init.d/functions
[root@manager ~]# checkpid 7541 7055 7052
[root@manager ~]# ll -d /proc/7541/
dr-xr-xr-x 9 root root 0 1月 16 08:41 /proc/7541/
[root@manager ~]# ll -d /proc/7541/ /proc/7055 /proc/7052
dr-xr-xr-x 9 root root 0 1月 16 08:34 /proc/7052
dr-xr-xr-x 9 root root 0 1月 16 08:34 /proc/7055
dr-xr-xr-x 9 root root 0 1月 16 08:41 /proc/7541/
#continue 基本含义
[root@manager ~]# for n in {1..10}; do [ $n -eq 5 ] &&continue ; echo $n ;done
1
2
3
4
6
7
8
9
10
for pid in $pids ; do
[ ! -e "/proc/$pid" ] && continue #如果pid目录不存在 则跳过本次循环 读取下1个pid目录
read -r line < "/proc/$pid/stat" 2> /dev/null
stat=($line)
stime=${stat[21]}
[ -n "$stime" ] && [ "$base_stime" -lt "$stime" ] && continue
remaining+="$pid "
done
#break 基本含义
[root@manager ~]# for n in {1..10}; do [ $n -eq 5 ] &&break ; echo $n ;done
1
2
3
4
[ -z "$kill_list" ] && break
[ -z "$line" ] && break
九九乘法表
[root@m01 scripts]# cat 99.sh
#!/bin/bash
for (( i=1; i<=9; i++ ))
do
for (( j=1; j<=i; j++ ))
do
(( k=$i*$j ))
echo -n "$j" "*" "$i" "=" "$k "
done
echo
done
[root@m01 scripts]# sh 99.sh
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
输出加特效
[root@manager ~]# echo -e "\E[5;32;41m红色字oldboy\E[0m"
红色字oldboy
99加颜色
#!/bin/bash
for (( i=1; i<=9; i++ ))
do
for (( j=1; j<=i; j++ ))
do
(( k=$i*$j ))
echo -ne "\E[5;31;40m"$j" "*" "$i" "=" "$k "\E[0m"
done
echo
done
输出内容加颜色(函数+case)
[root@manager ~]# cat /server/scripts/2.18.1-color.sh
#!/bin/bash
#author:oldboy
RED="\E[1;31m"
GREEN="\E[1;32m"
BLUE="\E[1;34m"
END="\E[0m"
input() {
cat <<EOF
1.input red 内容
2.input green 内容
3.input blue 内容
EOF
read -p "input choice:" cho
read -p "内容:" text
}
choice() {
case "$cho" in
1)
echo -e "${RED} $text ${END}"
;;
2)
echo -e "${GREEN} $text ${END}"
;;
3)
echo -e "${BLUE} $text ${END}"
;;
*)
echo "Usage: input {1|2|3}"
exit 1
esac
}
main() {
input
choice
}
main
:set cursorline vim中给光标加下划线
数组---------数组名[元素|下标]
[root@m01 scripts]# sun=(123 wer ddd)T
[root@m01 scripts]# echo ${sun[1]}
wer
[root@m01 scripts]# echo ${sun[2]}
ddd
[root@m01 scripts]# echo ${sun[0]}
123
[root@m01 scripts]# echo ${sun[*]}
123 wer ddd
通过文件给数组赋值并计算下标个数
数组的赋值方式
检查ip 是否ping的通
[root@m01 scripts]# cat ip_list.txt
10.0.0.61
10.0.0.71
10.0.0.81
10.0.0.202
2020年 01月 16日 星期四 11:46:23 CST
[root@m01 scripts]# cat check_ip.sh
#!/bin/bash
##############################################################
# File Name: check_ip.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
# Created Time : 2020-01-16 11:40:46
# Description:
##############################################################
ip_list=( `cat /server/scripts/ip_list.txt` )
check_ip() {
ping -c1 -i1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is ok"
else
echo "$ip is failed"
fi
}
main() {
for ip in ${ip_list[*]}
do
check_ip
done
}
main
2020年 01月 16日 星期四 11:46:34 CST
[root@m01 scripts]# sh check_ip.sh
10.0.0.61 is ok
10.0.0.71 is failed
10.0.0.81 is failed
10.0.0.202 is failed
vimrc家目录配置
[root@m01 ~]# cat ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2, "##############################################################")
call setline(3, "# File Name: ".expand("%"))
call setline(4, "# Version: V1.0")
call setline(5, "# Author: oldboy")
call setline(6, "# Organization: www.oldboyedu.com")
call setline(7, "# Created Time : ".strftime("%F %T"))
call setline(8, "# Description:")
call setline(9, "##############################################################")
call setline(10, "")
endif
endfunc
sed循环回车转换成空格
[root@manager ~]# tr '\n' ' ' <num.txt
1 2 3 4 5 6 7 8 9 10 [root@manager ~]#
[root@manager ~]# xargs <num.txt
1 2 3 4 5 6 7 8 9 10
[root@manager ~]# awk -vORS=" " '1' num.txt
1 2 3 4 5 6 7 8 9 10 [root@manager ~]#
正则VS通配符
取:右边的内容
**用perl正则(零宽断言)**取:右边内容
[root@m01 scripts]# cat id.txt |grep -Po '(?<=:)[0-9]+'
1
999
12306
996
取:左边内容