sed를 사용하여 파일의 *많은* 수의 변수 대체

sed를 사용하여 파일의 *많은* 수의 변수 대체

Linux 상자에 로그 파일이 너무 많아서 제3자에게 보내기 전에 중요한 데이터를 정리해야 합니다. 나는 이전에 이 작업을 수행하기 위해 아래 스크립트를 사용했으며 훌륭하게 작동했습니다(스크립트는 여기에서 도움을 받아 작성되었습니다 :-)).

#!/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+변수! 내부 한계에 부딪힌 것 같아요! 이렇게 많은 변수를 처리하는 방법에 대한 아이디어가 있는 사람이 있다면 정말 감사하겠습니다.

클라이언트 파일을 각각 약 100000개의 변수가 있는 4개로 분할하려고 시도했지만 여전히 작동하지 않습니다. 나는 실행해야 할 각 디렉토리에 최대 190개의 파일이 있는 20개의 디렉토리가 있기 때문에 계속 분할하는 것을 싫어합니다. 더 많은 클라이언트 파일을 만들수록 더 많은 패스를 수행해야 합니다.

답변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--file=

관련 정보