由浅入深shell脚本训练
最近一直在学习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 |
标签: Shell、linux