任務背景:因工作需要把大量生産系統下的.log檔案發外進行分析,總資料量接近1T,單個檔案大小約為1G。為了防止生産參數洩露,需将檔案中指定内容修改為'xxx'以屏蔽敏感資訊。
應用技術:Shell、sed、Python、threading多線程
方案一:Shell腳本+sed指令
>> cat rep_text.sh
#!/bin/bash
#This is a script for replacing contents in log.
function list_allfile(){ #使用遞歸函數将所有子目錄下的檔案儲存在 f_list數組
for file in $(ls $1)
do
if [ -d $1"/"${file} ];then
list_allfile $1"/"${file}
else
f_list[i]=$1"/"${file}
let i++
fi
done
}
i=0 #初始化數組下标
list_allfile $1
for f in ${f_list[@]} #sed批處理
do
echo -n $f resolfing...
sed -i "s/aaa.bbb.ccc/x.x.x/" $f
echo [ok]
done
方案二:Python+threading多線程
import os
import threading
def rep_text(rep_file): #替換文本函數
with open(rep_file, 'r') as fobj:
lines = fobj.readlines()
with open(rep_file, 'w') as fobj:
for line in lines:
rs = line.rstrip()
newname = rs.replace('aaa.bbb.ccc', 'x.x.x')
fobj.write(newname+'\r\n')
if __name__ == '__main__':
dirpath = "F:/test"
rep_file_list = []
for root, dirs, files in os.walk(dirpath): #遞歸擷取dirpath目錄下所有檔案,儲存在清單rep_file_list
for name in files:
rep_file_list.append(os.path.join(root, name))
for rep_file in rep_file_list: #多線程批量處理
t = threading.Thread(target=rep_text, args=(rep_file,))
t.start()
注意:rep_text函數中,通過 fobj.readlines() 方法将1G的檔案内容一次性讀取到清單中,需要考慮系統本身記憶體的容量;若檔案過大,可以考慮 fobj.readline() 分行處理,但讀/寫的對象不能是同一個檔案。