shell 的一些实用 demo 和 技巧分析
Demo 一
使用循环在 /test 目录下创建10个 txt文件,要求文件名称有6 位随机小写字母加固定字符串(_gg)组成,例如 pzjebg_gg.txt
随机字符串生成
- /dev/random 依赖系统中断生成随机字符串,可以保证数据的随机性但生成数据慢,会占用系统进程资源
- /dev/urandom 不依赖系统中断生成随机字符串,生成速度快,但数据随机性不足(一般使用/dev/urandom)
tr
命令
tr
命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符。
- -c: 取代所有不属于第一字符集的字符
- -d:删除所有属于第一字符集的字符
例如:从输入文本中,把不在字符集中的字符删除
➜ ~ echo "aa..,+1 b2c /* $dd 3 ls 4" | tr -dc '0-9 \n'
1 2 3 4
参考代码:
#!/bin/bash
if [ ! -d /test ]; then
mkdir /test
fi
cd /test
for((i=0;i<10;i++));do
filename=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 6)
touch ${filename}_gg.txt
done
相关试题
生成随机数字
- $RANDOM # 此系统变量可以默认随机生成 0~32767 的数字
[root@localhost ~]# echo $RANDOM 16120 [root@localhost ~]# echo $(($RANDOM%1000)) //1000 以内的随机数 171
Demo 二
有一个a.txt 文本(内容如下),要求将所有域名截取出来, 并统计重复域名出现的次数
http://www.baidu.com/index.html
https://www.atguigu.com/index.html
http://www.sina.com.cn/1024.html
https://www.atguigu.com/2048.html
http://www.sina.com.cn/4096.html
https://www.atguigu.com/8192.html
[root@localhost ~]# cat a.txt | cut -d '/' -f 3 | sort | uniq -c | sort -nr
3 www.atguigu.com
2 www.sina.com.cn
1 www.baidu.com
- 命令解释
- cut -d "/" -f 3 用 "/" 作为分隔符,获取第三字段
- sort 第一次排序
- uniq -c 显示改行重复次数
- sort -nr 按照数值从大到小排序(默认从小到大,-r 参数反转)
Demo 三
统计当前服务器正在连接的ip地址,并按连接次数排序
[root@localhost ~]# netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d ':' -f 1 | sort -n | uniq -c | sort -nr
1 192.168.1.31
- 命令解释 ,当使用空格作为分割符时,建议使用 awk ,cut 容易出问题
Demo 四
批量检查多个网站是否可以正常访问,要求使用 shell 数组实现, 检测策略尽量模仿用户真实的访问模式
- curl 命令选项
- -o:将命令输出保存到指定文件
- -s:Slient 模式。不输出任务内容
- 按指定格式输出内容,例如:-w %{http_code}:输出 http 状态码
- --connect-timeout:连接超时时间
#!/bin/bash
web=(
http://www.baidu.com
http://www.atguigu.com
http://www.gulixueyuan.com
1.1.1.1
)
for i in ${web[*]}; do
code=`curl -o /dev/null -s --connect-timeout 5 -w %{http_code} $i | grep -E "200|302"`
if [ ${code} != "" ]; then
echo "$i is ok" >> /root/ok.log
else
sleep 10
code=`curl -o /dev/null -s --connect-timeout 5 -w %{http_code} $i | grep -E "200|302"`
if [ ${code} != "" ]; then
echo "$i is ok" >> /root/ok.log
else
echo "$i is error" >> /root/error.log
fi
fi
done
Demo 五
查看php-fpm 后台进程是否存活 , 比如 vim php-fpm_daemon.sh
#!/bin/bash
#
ps -ef | grep php-fpm
将会看到下图
所以 grep 要grep -v grep
过滤掉 「grep」关键字,还要grep -v $$
或者 grep -v $0
过滤掉 bash 命令本身 ./php-fpm_daemon.sh
因为文件命名包含 php-fpm ,这是一个潜在的坑吧
参考代码
#!/bin/bash
#
this_pid=$$
ps -ef | grep php-fpm | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -eq 0 ];then
echo "php-fpm is running well"
else
systemctl start php-fpm
echo "php-fpm is down, start it ..."
fi
当然类似的方式还有使用 netstat 查看端口号,如果存在说明进程存在, 有些 web 服务器
进程还可以使用 curl 检测。
本作品采用《CC 协议》,转载必须注明作者和本文链接