【shell一天一练】grep命令、/dev/null

97 阅读1分钟

今日小练题目📢

写一个监控脚本,监控某站点访问是否正常。 提示: 1)可以将访问的站点以参数的形式提供,例如 sh xxx.sh www.aminglinux.com 2) 状态码为2xx或者3xx表示正常 3)正常时echo正常,不正常时echo不正常

优秀作业🤌🏻

#!/bin/bash
# author:xYLiuuuuuu
# version:v1
# date:2024-12-1

if ! which curl &>/dev/null
then
        echo "本机没有安装curl"
        apt install curl
        if [ $? -ne 0 ]
        then
                echo "没有安装成功curl"
                exit 1
        fi
fi

code=`curl --connect-timeout 3 -I $1 2>/dev/null | grep 'HTTP' |awk '{print $2}'`

if echo $code |grep -qE '^2[0-9][0-9]|^3[0-9][0-9]'
then
        echo "$1访问正常"
else
        echo "$1访问不正常"
fi

敲黑板📝

  • grep命令
# 多文件搜索
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep "本机" day10.sh day1.sh
day10.sh:       echo "本机没有安装curl"

# 加-l参数,列出包含key的文件名
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep -l "本机" day10.sh day1.sh
day10.sh

# 加-n参数,列出行号
(base) root@LAPTOP-D9G3KKGC:~/shell_demo# grep -n "本机" day10.sh day1.sh
day10.sh:8:     echo "本机没有安装curl"

# 加-v参数,显示与模式不匹配的行
$ grep -v "本机" day10.sh

# ^开头,$结尾
$ grep ^abc file
$ grep abc$ file

# 递归搜索加-r
$ grep -r key /dir

# 使用特殊字符组合 “^$” 打印文件中的所有空行
$ grep -n '^$' /etc/sysctl.conf

# “-i” 选项忽略模式和数据中的字母大小写

# 借助 grep 命令中的 “-e” 选项,我们可以在单个命令中搜索多个模式。
$ grep -E "nobody|mail" /etc/passwd

# “-c” 选项用于计算与搜索模式匹配的行数。
$ grep -c false$ /etc/passwd
6

# 打印模式匹配前后的 N 行
$ grep -B 4 "games" /etc/passwd #前
$ grep -A 4 "games" /etc/passwd #后
$ grep -C 4 "games" /etc/passwd #前后各四行
  • /dev/null 通常被用于丢弃不需要的输出流,或作为用于输入流的空文件
# 将标准输出重定向到 /dev/null
command > /dev/null
# 将错误信息重定向到 /dev/null
command 2> /dev/null
# 将标准输出和错误信息都重定向到 /dev/null
command > /dev/null 2>&1

常见使用场景:
# 通过把删除命令的输出重定向到 `/dev/null` 来避免输出错误信息, 同时也不用判断文件是否存在了
rm $1 >/dev/null 2>$1

# 清空文件内容
[tt@ecs-centos-7 dev_test]$ cat t.txt 
123456
[tt@ecs-centos-7 dev_test]$ cat /dev/null > t.txt 
[tt@ecs-centos-7 dev_test]$ cat t.txt 

# 只显示错误信息
command > /dev/null

# 只显示输出
command 2> /dev/null
  • $? 表示前一条命令的执行结果, 0 表示成功,其他表示失败
  • shell传递参数
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

$ chmod +x test.sh 
$ ./test.sh 1 2 3

执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3


特殊的:
$#	传递到脚本的参数个数
$*	以一个单字符串显示所有向脚本传递的参数。
     如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。
$$	脚本运行的当前进程ID号
$!	后台运行的最后一个进程的ID号
$@	与$*相同,但是使用时加引号,并在引号中返回每个参数。
    如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。
$-	显示Shell使用的当前选项,与set命令功能相同。
$?	显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。


$* 与 $@ 区别:

#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3