Xavier's Blog

日常工作中用到的Shell/Python命令——文本篇

| Comments

作为一名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

也可以结合之前的lessheadtail查看部分日志

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,仅需用一行:

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]

遍历文件

有时候需要依次对一些文件进行相同的处理,如果只是想遍历文件一个文件夹下面的某些文件,可以直接

for file in ./*.log; do echo "$file"; done

./zhixin_stat.log ./zhixin_stat.py.log

有时候需要构造一些序列,一般情况,用类似C语言的for循环,比如:

for ((i=0; i<=10; i++)); do echo 201304$i; done

2013040 2013041 2013042 2013043 2013044 2013045 2013046 2013047 2013048 2013049 20130410

但是可以发现,生成的序列宽度是不一样的,就需要用到seq命令了,它可能生成固定宽度的序列:

for i in `seq -w 1 10`; do echo 201304$i; done

20130401 20130402 20130403 20130404 20130405 20130406 20130407 20130408 20130409 20130410

用python进行排序

统计数据,难免需要对某几个维度进行分析,在python中进行排序,无非就是对于一个list进行排序,list中的元素一般为某个class或者一个dict

对于排序class,需要定义’<‘, ’>‘, ’<=‘, ’>=‘, ’==‘, ’!=‘六种比较行为,就好像C++中的operator重载一样。具体Python doc中这篇HowTo讲解的很清楚,这里不再赘述了。

对于dict进行排序,如果需要按照dict的某个key进行排序,则可以这么写:

from operator import itemgetter
#按照name字段进行排序  
newlist = sorted(list_to_be_sorted, key=itemgetter('name'))

用python发送邮件

好了,文本统计完了,生成了一份统计报表,这时候可能就需要我们通过邮件的形式发送给同事看。用crontab每天凌晨开始抓数据、跑统计、然后把统计数据邮件给大家,显得专业!

发送邮件的功能,可以用python + sendmail实现:

from os import path
import datetime
import time
import sys
import subprocess
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

sender = 'quxiao@somewhere.com'
receiver = 'someone@somewhere.com'

def main(date):
    EmailBody = 'blablabla'
    msg = MIMEMultipart()
    msg['Subject'] = 'some subject'
    msg['From'] = sender
    msg['To'] = receiver
    msg.attach(MIMEText(EmailBody,'html','GB18030'))
    #send
    proc = subprocess.Popen(['/usr/lib/sendmail','-t'],stdin = subprocess.PIPE)
    proc.stdin.write(str(msg))
    proc.stdin.close()

—EOF—

Comments