最近一直在学习Shell,以前一直觉得Shell语法很难,不好学,现在总算有一些收获了。其实Shell脚本就是一堆linux命令的集合,把脚本里每一步的命令搞懂是什么意思,然后整个脚本的意思就搞出来了;同样要通过脚本完成一项工作,就把这项工作分解成若干的小命令,然后把小命令集合起来就可以了。至于什么awk、sed、正则,都要靠自己平常的积累。
①查询一个服务某天的请求次数:
|
1
2
|
cat renren-1.log|grep "MSG without parse">temp
awk '{a[$1]++}END{for(i in a)print i,a[i]}' temp
|
②第一列相同,第二列相加:
|
1
|
awk '{a[$1]+=$2}END{for(m in a)print m,a[m]}'
|
③查询包含log字符的文件名称:
|
1
|
find . -name "*.log*" -type f | xargs ls -l
|
④查询批量服务某一天请求次数:
|
1
2
3
4
5
6
7
8
|
#!/bin/bash#查询批量服务某一天请求次数find . -name "*log*" -type f | xargs ls -l > logs_ll
awk '{print $8}' logs_ll > logs
cat logs | while read line
do echo $line echo 2013-08-01 cat $line | egrep ">>>|MSG without parse" | grep "2013-08-01" |wc -l
done |
⑤查询批量服务某一天请求次数,过滤掉请求次数为0的请求:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash#查询批量服务某一天请求次数,过滤掉请求次数为0的请求find . -name "*log*" -type f | xargs ls -l > logs_ll
awk '{print $8}' logs_ll > logs
cat logs | while read line
COUNT=`cat $line | egrep ">>> |MSG without parse" | grep "2013-07-02" | wc -l`
do if [ $COUNT -ne 0 ]; then
echo $line 2013-07-02
echo $COUNT
else
echo $line >/dev/null
fi
done |
⑥查询批量服务某个月请求次数,过滤掉请求次数为0的请求:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/bin/bash#查询批量服务某个月请求次数,过滤掉请求次数为0的请求find . -name "*log*" -type f | xargs ls -l > logs_ll
awk '{print $8}' logs_ll > logs
for day in `seq 30`
do cat logs | while read line
COUNT=`cat $line | egrep ">>> |MSG without parse" | grep "2013-08-$day" | wc -l`
do
if [ $COUNT -ne 0 ]; then
echo $line 2013-08-$day
echo $COUNT
else
echo $line >/dev/null
fi
done
done |
⑦统计输出一个服务在某段时间的请求次数和对应的日期:
|
1
2
|
cat $line | egrep ">>> |MSG without parse" |awk '{print $1}' >>log.tmp
cat log.tmp |sort |uniq -c
|
⑧查询批量服务在所有日期的请求次数,并过滤掉请求次数为0的请求,输出服务名、日期和对应的请求次数:
|
1
2
3
4
5
6
7
8
9
10
11
|
#!/bin/bash#查询批量服务在所有日期的请求次数,并过滤掉请求次数为0的请求,输出服务名、日期和对应的请求次数find . -name "*log*" -type f | xargs ls -l > logs_ll
awk '{print $6,$8}' logs_ll > logs
awk '{print $2}' logs>log
cat log | while read line
do cat $line | egrep ">>> |MSG without parse" | awk '{print $1}' > $line.tmp
echo $line
cat $line.tmp |sort | uniq -c
done |