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

将会看到下图

shell 的一些实用 demo 和 技巧分析

所以 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!