使用 sed 替換檔案中的“大量”變數

使用 sed 替換檔案中的“大量”變數

我有大量的日誌文件,在 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模式寫入檔案並將其傳遞給sedwith option --file=。命令列參數並不意味著傳遞大量資料。

相關內容