在学习使用python处理日志开始阶段,对我阻力最大的莫过于对linux的不熟悉了,有种寸步难行的感觉。

在之后乱学一通之后,发现有点对我颇有益处:

  1. 学《鸟哥linux私房菜基础学习篇》,内容不多,但是对linux文件系统和基本组成有个基本的认识很有必要;
  2. 熟悉使用vim。开始的时候每次都下载到windowns再编辑实在太傻 了~;
  3. 使用ls -l + 通配符查找文件,复杂的查找使用find;
  4. 按自己需要学习linux文本领域的三大利器:grep(查找)、sed(编辑)、awk(分析)

大概整理下之前常用的命令:

一、find命令

1、查找当前目录下非空且满足命名要求的文件



find ./ ! -empty -name "*20160228*"



(注意空格)

2、在一堆文件中查询关键字所在的行



find ./-name "*20160228*" | xargs cat | grep "189"



也可以直接使用



cat "*20160228*" | grep "189"



cat一堆文件首先会把一堆文件合并为一个大文件。

3、查找并复制



find ./ -name "*201504101446*" | xargs  -i cp {}  ./yourDir



4、查找并删除



$find ./ -name "*201502*.log" -exec rm {} \;



【注】exec与xargs差异



在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。



但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。



错误信息通常是“参数列太长”或“参数列溢出”。



5、查询当前目录下每个文件的行数



find . -type f | xargs wc -l



仅获取当个文件行数



cat tcpSocketSer.py | wc -l



仅获取所有文件的总行数



find . -type f -exec wc -l {} \; | awk '{sum+=$1}END{print sum}'



二、awk命令

6、将某一列的值累加



cat flowgw_billing.log.201512 | awk '{sum +=$5} END {print sum}'



7、更改文件列顺序



cat daily_partner_bill.log.20150806 | awk '{print $4"\t"$1"\t"$2"\t"$3}' > test2;mv test2 daily_partner_bill.log.20150806



比较笨拙的做法,暂时想不到其他的了。

8、指定列条件并累加



cat 201507.log | awk '$2=="hengDa" {sum +=$4} END {print sum}'



指定条件分开累计



cat 201511.log |  awk '$3=="selectName" {a[$2]+=$5;} END {for(i in a) print i,a[i]}'



9、分运营商初步统计



cat 201511??.log |  \
awk '$3=="selectName" {a[$2]+=$5;} END {for(i in a) print i,a[i]}' | \
awk  --re-interval '{if($1 ~/(133|153|180|181|189|177)[0-9]{8}/) print "CTCC",$1,$2;\
else if($1 ~/(134|135|136|137|138|139|150|151|152|158|159|182|183|184|157|187|188|147|178)[0-9]{8}/) print "CMCC",$1,$2;\
else if($1 ~/(130|131|132|155|156|145|176|185|186|175)[0-9]{8}/) print "CUCC",$1,$2;\
else print "None",$1,$2}END{}'



三、压缩文件

10、不解压查询压缩文件列表



gzip -dc fff.tar.gz | tar tvf -



如果压缩文件内带有文件夹则不行

11、不解压查看文件内容



zcat fff.tar.gz | cut -f 2-12



输入内容会附带文件属性信息,可以用cut -f 按字段截取部分想要的

12、查询已打包文件内容



zcat *201504_30*.log | grep --binary-files=text 15360436158 | cut -f 2-11



若需要匹配文件复杂,可以使用find命令衔接



find . -type f -name  "201504_30" | xargs  zcat {} \; | grep --binary-files=text  "15360436158"



13、将当前文件夹所有压缩文件解压,并删除原文件



for tar in *.tar.gz;  do tar xvf $tar; done
find ./ -name  "*.gz" | xargs rm -rf



四、排序去重

由于uniq只是针对相邻行去重,所以通常和sort配合使用。

sort参数简要说明



-n     按数值
-k 2    按第二列
-r  反序
-t: 以冒号分隔



uniq参数简要说明



-i  忽略大小写字符的不同
-c  进行计数
-u  只显示唯一的行
-d  仅显示存在重复的行



14、查询累计用户数(每条记录包含一个电话号码)



cat 201?????.log | cut -f 1 | sort | uniq | wc -l



15、查询非电信累计用户数(添加正则匹配条件)



cat 201?????.log | cut -f 1 | sort | uniq | egrep -v '^1(33|53|77|8[019]|700).{7,8}$' | wc -l



五、文件合并



  • 行合并
cat file1 file2
  • 列合并
  • paste file1 file2
  • 取文件交集
cat file1 file2 | sort | uniq -d
  • 取文件并集
cat file1 file2 | sort | uniq



六、其他

16、查询进程是否存在



ps -ef | grep test.py | grep -v grep



grep本身存在一进程,容易误导

查询并杀死进程



ps -ef | grep test.py| grep -v grep | awk '{print $2}' | xargs kill -9



17、查询端口占用情况



lsof -i:65432



18、查找文件并打包,以当前时间命名



find ./ -name "*log"| xargs tar -zvcf logs.`date +%Y-%m-%d`



其中,`date +%Y-%m-%d-%H%M%S`为可嵌入命令时间格式

19、在后台运行程序



nohup python test.py &



这种方式运行不稳定,可以使用Linux下的脚本管理工具supervior来统一管理。

20、标准输出和标准错误输出



find ./ -name *.log >& all_result



21、启动简易http服务器,实现简单的文件访问



$ python -m SimpleHTTPServer 8080



在你想要启用访问的目录下执行

22、格式化json

我们经常需要用curl访问一个已存在的接口,但是返回结果不易查看,可以简单格式化



cat  jsonString | python -mjson.tool