作为一名RD,作为一名后端RD,每天大部分的工作都是在终端上面完成的,除了在vim上面编写代码,也需要分析日志、数据,定时跑一些任务,因此各种shell、各种脚本语言也是不少用。罗列些自己平时工作中用到查看、处理文本的命令:
查看日志
平常查看模块打印的日志,肯定是必需的,比如需要知道一个模块重启后运行是否正常,需要查看请求返回的一些字段。日志比较小的话(100Mb以内),可以直接用vim
打开,否则会把服务器内存全部吃掉,甚至把服务器搞挂。。。
文件太大的话,可以用less
或者more
命令打开,这样不会把整个文件都load到内存,然后再使用“/”或者”?”向后或者向前查找需要的字符串
有时只需要看看文件的头尾几行,看看日志的格式如何,用head
以及tail
就可以,特别,如果需要实时查看日志,则可以使用tail -f
。
过滤日志
有时只需要获取日志的某些行,比如查找哪些行包含”FATAL”,就可以用
grep "FATAL" xxx.log
如果先是想看看有没有这类日志存在,就用管道结合wc -l
grep "FATAL" xxx.log | wc -l
也可以结合之前的less
、head
、tail
查看部分日志
grep "FATAL" xxx.log | less
如果是想获取日志中的某些字段,可以使用cut
命令进行分割
假设有如下日志:
1 2 3 4 5
11 12 13 14 15
获取第三列,用cat xxx.log | cut -d'\t' -f3
,就可以得到
3
13
有时候,日志比较复杂,比如:
a=1,b=2,c=3
比如还是获取第三列,则可以:
cat xxx.log | cut -d',' -f3 | cut -d'=' -f2
过滤日志,也可以使用awk
,但感觉如何不是对于日志的数据进行计算,只用awk
进行过滤,未免有些大材小用了,呵呵。
计算日志字段
好,这个时候awk
就可以排上用场了,它不但能对字段进行过滤、累加、对日志按类似C语言printf()
的格式进行输出,还可以进行dict运算。比如有一份日志保存着每次请求的query字段:
htc
iphone4s
htc
sumsung
xiaomi
我需要知道每个query的频次,用几行python应该也能很快搞定,不过用awk
,仅需用一行:
1 | cat xxx.log | awk '{dict[$1]++;} END{for(i in dict){printf "query:[%s] pv:[%d]\n", i, dict[i];}}' |
query:[xiaomi] pv:[1]
query:[sumsung] pv:[1]
query:[htc] pv:[2]
query:[iphone4s] pv:[1]
遍历文件
有时候需要依次对一些文件进行相同的处理,如果只是想遍历文件一个文件夹下面的某些文件,可以直接
1 | for file in ./*.log; do echo "$file" ; done |
./zhixin_stat.log
./zhixin_stat.py.log
有时候需要构造一些序列,一般情况,用类似C语言的for循环,比如:
1 | for ((i=0; i<=10; i++)); do echo 201304$i; done |
2013040
2013041
2013042
2013043
2013044
2013045
2013046
2013047
2013048
2013049
20130410
但是可以发现,生成的序列宽度是不一样的,就需要用到seq命令了,它可能生成固定宽度的序列:
1 | for i in ` seq -w 1 10`; do echo
TAG: 标题搜索日历
我的存档数据统计
|