我有大量的日誌文件,在 Linux 機器上,我需要在發送給第三方之前清理敏感資料。我以前曾使用以下腳本來執行此任務,並且效果非常好(腳本是在此處的一些幫助下構建的:-)):
#!/bin/bash
help_text () {
cat <<EOF
Usage: $0 [log_directory] [client_name(s)]
EOF
exit 0
}
CMDLINE=""$0" "$@""
if [ -z "$1" ]; then
help_text
else
pattern=""
delim=""
n=1
counter=`find "$1" -name *.gz |sort |wc -l`
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$2"
while read -r line
do
pattern=$pattern$delim$line
delim="|"
done
exec 0<&3
IFS=$BAKIFS
while [ $n -lt $counter ]
do
for i in `find "$1" -name *.gz |sort`
do
gunzip "$i"
i_unzip=$(echo "$i" |sed 's/\.[^\.]*$//')
sed -ri "s/$pattern/CLIENT/g" "$i_unzip"
gzip "$i_unzip"
done
n=n+1
done
fi
exit 0
但是,現在我們的一個部門向我發送了一份 CLIENT_FILE.txt,其中包含425000+變數!我想我可能已經達到了一些內部極限!如果有人知道如何處理這麼多變量,我將非常感激。
我嘗試將客戶端文件分成 4 個,每個文件包含大約 100000 個變量,但這仍然不起作用。我討厭繼續拆分,因為我有 20 個目錄,每個目錄中最多有 190 個檔案要運行。我製作的客戶文件越多,我需要做的遍數就越多。
答案1
我會嘗試這樣的事情:
#!/bin/bash
files=()
while read file; do
gunzip "$file" && files+=( "${file%.gz}" )
done < <(find "$1" -name '*.gz')
awk '
FILENAME == ARGV[1] {
client_name[$0]++
next
}
FNR == 1 {
output = FILENAME ".new"
}
{
for (i=1; i<=NF; i++) {
if ($i in client_name)
$i = "CLIENT"
}
print > output
}
' "$2" "${files[@]}"
for file in "${files[@]}"; do
mv "$file" "$file.old" &&
mv "$file.new" "$file" &&
gzip "$file"
done
如果您的日誌檔案不僅僅包含簡單的空格分隔行,則 awk 腳本可能會破壞格式。
答案2
您應該嘗試將sed
模式寫入檔案並將其傳遞給sed
with option --file=
。命令列參數並不意味著傳遞大量資料。