第一题:生成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 ""
运行截图