数组定义
说明:
数组读取/删除
arr=(a b c d e)
echo ${#arr[@]}
echo ${#arr[*]}
echo ${arr[@]}
echo ${arr[*]}
echo ${arr[1]}
filelist=(`ls`) for file in ${filelist[@]};do echo $file done
unset arr[1] echo ${arr[*]}
|
切片/元素替换
arr=(a b c d e)
arr2=(${arr[@]:0:3}) echo ${arr2[@]}
arr=(a b c d e) echo ${arr[@]/a/aaa}
|
- 切片(分片): 直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
- 替换: ${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,请重新定义变量并赋值。
实例
在一个多域名的web server环境中,通过分析访问日志,统计最近8小时有用户访问的域名(去重),并显示。
日志格式:X-Forworld-IP User-IP YYYY-MM-DD HH:mm:ss method “URL” HTTP响应码 服务器处理时间 返回大小 “Refer” “浏览器信息” “虚拟主机域名” 真实处理请求的主机
#!/bin/bash
AWKBin="/usr/bin/awk" EGREPBin="/bin/egrep" SORTBin="/usr/bin/sort" SEDBin="/bin/sed"
VSName=$1
TimePeriod=$2
FilterKeys='''DNSPod-Monitor|JianKongBao'''
LOGPath="/logs/nginx"
Result=()
while (( TimePeriod > 0 )) do LogTime=`date -d "- ${TimePeriod}hours" +%Y-%m-%d-%H` LogFile=${VSName}_${LogTime}.log
Result=(${Result[@]} `$AWKBin '{if($5!~/HEAD/ && $5!~/\"\"/ ) print $0}' ${LOGPath}/${LogFile} | \ $EGREPBin -v $FilterKeys | $AWKBin '{print $NF}' | $AWKBin -F '@' '{print $1}' |\ $SORTBin -u`)
echo "第$TimePeriod 个日志:${Result[*]}"
((TimePeriod--)) done
echo "未去重:${Result[*]}"
Result=($(awk -vRS=' ' '!a[$1]++' <<< ${Result[@]}))
echo "去重以后:${Result[*]}"
|