파일에서 사용자 이름을 제거하고 증분 숫자로 바꿉니다.

파일에서 사용자 이름을 제거하고 증분 숫자로 바꿉니다.

텍스트 처리 문제입니다. 2개의 파일이 있습니다.

joeblogs
johnsmith
chriscomp
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" johnsmith@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" chriscomp@hostname

파일 1에는 로그(파일 2)에 나타나는 고유한 사용자 이름 목록이 포함되어 있습니다.

원하는 출력

12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname

이 두 파일은 필요 없을 것 같아요. 파일 1은 파일 2의 고유 사용자 이름을 구문 분석하여 생성됩니다. 내 논리는 내가 아는 사용자 이름 목록을 파일 2에 표시한 다음 이를 반복하여 sed.

그것은 다음과 같습니다:

for i in $(cat file1);do sed -e 's/$i/USER[X]';done

USER[X]각 고유 사용자 이름에 따라 증가합니다 .

그러나 나는 이것을 할 수 없습니다. 나는 그 논리가 건전하다고 생각하지도 않는다. 원하는 결과를 얻을 수 있도록 도와주실 수 있나요? awk/// sed모두 환영합니다.grepbash

답변1

당신이 당신을 깨달았을 때"이 두 파일은 필요하지 않습니다.", 다음을 사용하십시오awk초기 처리 솔루션통나무일회성 보관:

awk '{
         u_name = substr($5, 1, index($5, "@"));
         if (!(u_name in users)) users[u_name] = ++c;
         sub(/^[^@]+/, "USER" users[u_name], $5)
     }1' file.log

산출:

12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname

답변2

또 다른 이상한

awk '!($5 in a){a[$5]=++i}{sub("[^@]*","USER"a[$5],$5)}1' infile

답변3

Bash를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

n=0
declare -A users=()
while IFS= read -r line; do
    if [[ $line =~ ([^[:blank:]]+)@ ]]; then
        user=${BASH_REMATCH[1]}
        if [[ -z ${users[$user]} ]]; then
            users[$user]=USER$((++n))
        fi
        line=${line/$user/${users[$user]}}
    fi 
    echo "$line"
done < File2

또는 Perl 한 줄의 코드

perl -pe 's/(\S+)(?=@)/ $users{$1} ||= "USER".++$n /e' File2

답변4

를 사용하면 sed다음을 수행할 수 있습니다.

$ sed "$(sed '=' File1 | sed -r 'N;s/(.*)\n(.*)/s%\2@hostname%USER\1@hostname%/')" File2
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
$ 

여기에는 3개의 명령이 있습니다 sed. sed명령 2와 3은 File1에서 sed 표현식을 생성하며, 이는 Command 1에서 File2를 처리하는 데 사용됩니다.

  • 명령 2는 File1의 각 줄 뒤에 줄 번호를 추가합니다.
  • 명령 3은 File1의 각 줄과 그 뒤에 오는 줄 번호를 식으로 다시 정렬하여 File1의 모든 사용자 등 sed을 대체합니다 joeblogs@hostname.USER1@hostname
  • 그런 다음 Command1은 생성된 sed표현식을 사용하여 File2의 모든 대체 항목을 처리합니다.

관련 정보