序
在學習使用python處理日志開始階段,對我阻力最大的莫過於對linux的不熟悉了,有種寸步難行的感覺。
在之后亂學一通之后,發現有點對我頗有益處:
- 學《鳥哥linux私房菜基礎學習篇》,內容不多,但是對linux文件系統和基本組成有個基本的認識很有必要;
- 熟悉使用vim。開始的時候每次都下載到windowns再編輯實在太傻 了~;
- 使用ls -l + 通配符查找文件,復雜的查找使用find;
- 按自己需要學習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 . -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
LINUX學習參考:
http://linuxtools-rst.readthedocs.org/zh_CN/latest/base/index.html