ws NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-" 124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-" 124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"
解答:模拟环境
cd /var/log
touch access.log 1.log 2.log
vim access.log(添加内容,生成日志)
法一:通过两个数组来计算(用到数组累加和去重)
因为我们要的最终结果是某个文件的访问次数和消耗的流量,所以考虑建立以文件名为索引的两个数组,一个存储访问次数,一个保存消耗的流量,这样当使用awk按行遍历文件时,对次数数组+1,同时对流量数组进行文件大小的累加,等文件扫描完成,再遍历输出两个数组既可以得到该文件的反问次数和总的流量消耗。
awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' access.log|sort -rn -k1|head -10 >1.log
cat 1.log
46232 1 /?=
22598 2 /static/images/photos/2.jpg 4460 1 /static/js/web_js.js 3583 1 /static/flex/vedioLoading.swf 1627 1 /static/js/jquery.lazyload.js
法二:
awk '{print $7"\t" $10}' access.log|awk '{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S1[i],i}'|sort -rn|head -10 >2.log
cat 2.log
46232 1 /?=
22598 2 /static/images/photos/2.jpg 4460 1 /static/js/web_js.js 3583 1 /static/flex/vedioLoading.swf 1627 1 /static/js/jquery.lazyload.js
13、把/oldboy目录及其子目录下所有以扩展名.sh结尾的文件中包含oldboy的字符串全部替换为oldgirl【附加题:加分题,不会的同学可以放弃不答】。
解答:
模拟环境:
mkdir -p /oldboy/test
touch a.txt /oldboy
touch b.txt /oldboy/test
echo "oldboy" >a.sh
echo "oldgirl" >b.sh
法一:sed
sed -i "s#oldboy#oldgirl#g" /oldboy/*.txt
sed -i "s#oldboy#oldgirl#g" `find/oldboy/ -type f -name "*.sh"`
sed -i "s#oldboy#oldgirl#g" $(fing/oldboy/ -type f -name "*.sh")
法二:find+|xargs
find /oldboy/ -type f -name "*.sh" |xargs sed -i "s#oldboy#oldgirl#g"
find /oldboy/ -type f -name "*.sh" -exec sed -i "s#oldboy#oldgirl#g {} \;
法三:for语句
for i in `ll /oldboy | grep .sh|awk '{print $NF}'`
do
sed -i 's#oldboy#oldgirlg'$i
done
|