柏油linux课程 shell script上机实验

第一题:生成TCP活动状况报告

[show_tcp_status.sh]

#!/bin/bash

# 将部分获取数据的语句保存为变量,方便引用

# 使用awk命令配合NR参数,检出segments sent out和segments received两行对应的数值(废弃)
# TCP_DATA_INIT=$(netstat --statistics --tcp | awk 'NR==10, NR==11 {print $1}')

# 使用date命令配合格式串获取当前时间数据
# GET_DATETIME: $(date "+%Y-%m-%d %H:%M")

# 获取第一个时刻的计数数据,带PREV的变量将用于后续时刻参照计算前一时刻数据的变化量
SUM_SEND_PREV=$(netstat --statistics --tcp | grep -oP '(?<=[ ])[0-9]+(?= segments received)')
SUM_RECV_PREV=$(netstat --statistics --tcp | grep -oP '(?<=[ ])[0-9]+(?= segments sent out)')
TOTAL_PREV=0

# 打印第一个时刻初始为0的统计数据
CURRENT_DATETIME=$(date "+%Y-%m-%d %H:%M")
echo ${CURRENT_DATETIME} "0 0 0"

sleep 60

while true
do
	# 获取当前时间netstat中TCP相关统计数据
	# 使用awk命令配合NR参数,检出segments sent out和segments received
	# 	此两行的第一段文本,即对应项目的数值
	# 已废弃
	# TCP_DATA=$(netstat --statistics --tcp | awk 'NR==10, NR==11 {print $1}')

	# 此两行的第一段文本,即对应项目的数值
	SUM_SEND=$(netstat --statistics --tcp | grep -oP '(?<=[ ])[0-9]+(?= segments received)')
	SUM_RECV=$(netstat --statistics --tcp | grep -oP '(?<=[ ])[0-9]+(?= segments sent out)')
	
	CURRENT_DATETIME=$(date "+%Y-%m-%d %H:%M")

	# 使用bc运算此一分钟内的发送接收量,并计算I/O总和
	SEND_RECORD=$(echo $SUM_SEND - $SUM_SEND_PREV | bc)
	RECV_RECORD=$(echo $SUM_RECV - $SUM_RECV_PREV | bc)


	TOTAL=$(echo $SEND_RECORD + $RECV_RECORD | bc)

	# 计算差值
	SUB_VALUE=$(echo $TOTAL - $TOTAL_PREV | bc)

	LOG_STAT="${CURRENT_DATETIME} ${SEND_RECORD} ${RECV_RECORD} ${TOTAL}"

	# 判断差值落在(10, +∞) [-10, 10] (-∞, -10)中的哪个区间内
	if [ $SUB_VALUE -gt 10 ]; then
		LOG_STAT=${LOG_STAT}" +"
	elif [ $SUB_VALUE -ge -10 ]; then
		LOG_STAT=${LOG_STAT}"  "
	else
		LOG_STAT=${LOG_STAT}" -"
	fi

	# DEBUG语句
	# echo 
	# echo $SUM_SEND $SUM_RECV $SUB_VALUE
	echo $LOG_STAT

	# 更新参照数据
 	SUM_SEND_PREV=${SUM_SEND}
  	SUM_RECV_PREV=${SUM_RECV}
   	TOTAL_PREV=${TOTAL} 

	# 遵照要求睡眠60秒
	sleep 60
done

运行结果

在这里插入图片描述
在这里插入图片描述

第二题:下载bing图库中图片

download_bing_image.sh

#!/bin/bash

# 获取脚本初始工作目录(直接赋值PWD也可行)
_PWD=$(dirname $(readlink -f $0))

# 访问必应壁纸某一页的基础URL
BASE_URL="https://bing.ioliu.cn/?p="
API_URL="https://bing.ioliu.cn/v1/rand?type=json"

# 设定下载图片页数的上下界
PAGE_LOWER_BOUND=1
PAGE_UPPER_BOUND=140

# 是否应用随机模式
RANDOM_MODE=0
RANDOM_PAGE_COUNT=0

# 如果命令行参数个数为2,检查参数合法性
# 要不要用bc做除法判断?
# 实属懒得做边界检查啊啊啊啊
if [ $# -eq 2 ]; then
    # 如果参数1为 "rand"
    if [ $1 == 'rand' ]; then
        RANDOM_MODE=1
        # 判断参数2是否为数字
        if [ -z $(echo $2 | egrep "^[0-9]+$") ]; then
            echo "please check your 2st argument: "$2
            exit 2
        else
            RANDOM_PAGE_COUNT=$2
        fi

    # 如果参数1不为数字
    elif [ -z $(echo $1 | egrep "^[0-9]+$") ]; then
        echo "please check your 1st argument: "$1
        exit 2
    else
        if [ -z $(echo $2 | egrep "^[0-9]+$") ]; then
            echo "please check your 2st argument: "$2
            exit 2
        else
            PAGE_LOWER_BOUND=$1
            PAGE_UPPER_BOUND=$2
        fi
    fi
# 如果参数个数不为0,则退出
elif [ $# -ne 0 ]; then
    echo "failed to bind command line arguments(neither 0 or 2)"
    exit 1
fi
echo ""
echo "[SCRIPT INFO]:"
echo "    PAGE_LOWER_BOUND: "${PAGE_LOWER_BOUND}
echo "    PAGE_UPPER_BOUND: "${PAGE_UPPER_BOUND}
echo "    RANDOM_MODE: "${RANDOM_MODE}
echo "    RANDOM_PAGE_COUNT: "${RANDOM_PAGE_COUNT}


# 创建[图片存储文件夹 bing]与[html缓存数据文件夹 cache]
mkdir -p ./bing ./cache
cd bing

# 随机下载rand模式
if [ ${RANDOM_MODE} -eq 1 ]; then
    for ((count=0; count < ${RANDOM_PAGE_COUNT}; count += 1))
    do
        # 获取http response json内容
        JSON=$(curl -s $API_URL)
        if [ $? -ne 0 ]; then
            echo "FAILED TO GET JSON RESPONSE BODY"
            let "count -= 1"
        else 
            # 解析图片信息
            PIC_DATE=$(echo $JSON | grep -Po 'enddate[" :]+\K[^"]+')

            PIC_DATE=$(echo $PIC_DATE | sed 's/20\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/20\1-\2-\3/g')
            PIC_URL=$(echo $JSON | grep -Po 'url[" :]+\K[^"]+')
            PIC_NAME=$(echo $JSON | grep -Po 'copyright[" :]+\K[^"]+' | sed 's/\//, /g' | sed 's/ ([^)]*)//g')
            FILE_NAME="$PIC_DATE $PIC_NAME.jpg"
            
            # 生成随机文件名
            RANDOM_NAME="__${RANDOM}"

            # 下载URL并保存为随机文件名
            curl -s -C- -o "${RANDOM_NAME}" "${PIC_URL}"
            if [ $? -eq 0 ]
            then
                # 通过md5摘要判断文件是否存在于bing目录下
                CHECK_SUM=$(md5sum "${_PWD}/bing/${RANDOM_NAME}" | awk '{print $1}')
                
                LINE_INFO=$(grep $CHECK_SUM ${_PWD}/bing/duplicate_check.set)
                if [ -z "${LINE_INFO}" ]; then
                    # 若存在,则重命名为目标文件名,并保持md5摘要到本地列表中
                    mv "${_PWD}/bing/$RANDOM_NAME" "${_PWD}/bing/${FILE_NAME}"
                    echo "[Task ${count}]"
                    echo "    succeed to save image ${FILE_NAME}"
                    echo "$CHECK_SUM ${FILE_NAME}" >> duplicate_check.set
                else
                    # 若不存在,则跳过下载,删除临时文件
                    let "count -= 1"
                    echo "FILE ALREADY EXISTS, SKIPPING DOWNLOADING"
                    rm -f "${_PWD}/bing/$RANDOM_NAME"
                fi
            else
                echo "failed to save image ${FILE_NAME}"
                let "count -= 1"
            fi
        fi
    done
else
    for ((index=${PAGE_LOWER_BOUND}; index <= ${PAGE_UPPER_BOUND}; index += 1))
    do
        if [ -f "${_PWD}/cache/${index}.html" ]; then
            echo "skipping download ${index}.html"
        else
            wget -O "${_PWD}/cache/${index}.html" "${BASE_URL}${index}" -q # &
        fi

        URL_SET=$(cat "${_PWD}/cache/${index}.html" | grep -oP '(?<=pic\=).*?(?=\?)')
        DATE_SET=$(cat "${_PWD}/cache/${index}.html" | grep -oP '(?<=em class="t">)[0-9]*\-[0-9]*\-[0-9]*(?=</em>)')
        NAME_SET=$(cat "${_PWD}/cache/${index}.html" | grep -oP '(?<=<div class="description"><h3>).*?(?=/h3>)' | sed -e 's/[( (].*</>/g')

        for ((iter=1; iter <= 12; iter += 1))
        do
            URL=$(echo ${URL_SET} | awk "{print \$${iter}}")
            PIC_NAME=$(echo ${NAME_SET} | awk -F '> ' "{print \$${iter}}")
            
            if [ ${iter} -eq 12 ]; then
                PIC_NAME=$(echo ${PIC_NAME} | sed 's/>//g')
            fi

            FILE_NAME=$(echo ${DATE_SET} | awk "{print \$${iter}}")" ${PIC_NAME}.jpg"

            if [ -f "${FILE_NAME}" ]; then
                echo "skipping download ${FILE_NAME}"
            else
                curl -s -C- -o "${FILE_NAME}" "${URL}"
                if [ $? -eq 0 ]; then
                    echo "succeed to save image ${FILE_NAME}"
                    # 下载成功,保存md5摘要到本地列表
                    echo $(md5sum "${FILE_NAME}" | awk '{print $1}')" ${FILE_NAME}" >> duplicate_check.set
                else
                    echo "failed to save image ${FILE_NAME}"
                fi
            fi
        done

    done
fi

cd ..
echo ""

运行截图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值