天天看點

批量修改子目錄下所有文本檔案的指定内容(兩種方案)

任務背景:因工作需要把大量生産系統下的.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() 分行處理,但讀/寫的對象不能是同一個檔案。