用Python正则表达式搜索统计命令行管道中的所有数字
由于最近经常要对庞大的Android代码进行统计,于是写了一个Python脚本,可以把命令行中输出的所有管道数据中的数字找出来,并进行累加等操作,使用起来非常快捷高效。
例如,我希望统计Android frameworks目录中所有java/c/cpp/h代码文件的总行数,那么可以这样:
1. 用find命令搜索出所有代码文件:
find ./frameworks -iname "*.java" -o -iname "*.cpp" -o -iname "*.h" -o -iname "*.c"
2. 用wc -l命令统计所有搜索出来的代码的行数:
find ./frameworks -iname "*.java" -o -iname "*.cpp" -o -iname "*.h" -o -iname "*.c" | xargs wc -l
上边这个命令行会输出搜索到的每个文件的行数,并且文件数达到一定数量后会输出一个”总用量“。
3. 用grep命令把以上统计输出的带”总用量“的输出行过滤出来:
find ./frameworks -iname "*.java" -o -iname "*.cpp" -o -iname "*.h" -o -iname "*.c" | xargs wc -l | grep "总用量"
输出结果:
384002 总用量 725006 总用量 591547 总用量 653540 总用量 666876 总用量 326548 总用量
4. 用自己写的Python脚本把上边输出的所有数字过滤出来并累加:
Python脚本sum_all_numbers.py:
#!/usr/bin/python # coding=utf-8 import sys; import re items = [] for name in sys.stdin.readlines(): #从管道中读取每一行数据 nums = re.findall("\d+ ", name) #用正则表达式找出所有数字 for num in nums: items.append(num) if(len(items)>0): print items sumNum = 0 for num in items: sumNum += int(num) #累加所有数字 print "Total:",sumNum
用这个脚本对命令行管道的输出数据作统计:
find ./frameworks -iname "*.java" -o -iname "*.cpp" -o -iname "*.h" -o -iname "*.c" | xargs wc -l | grep "总用量" | python ~/scripts/sum_all_numbers.py
输出结果:
['384002 ', '725006 ', '591547 ', '653540 ', '666876 ', '326548 '] Total: 3347519