删除文件中的用户名并替换为增量数字

删除文件中的用户名并替换为增量数字

这是一个文本处理问题。我有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

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 表达式,命令 1 又使用该表达式来处理 File2:

  • 命令 2 只是在 File1 的每一行后面附加行号
  • 命令 3 将 File1 的每一行及其后面的行号重新排列为一个sed表达式,以将 File1 中所有用户的 eg 替换joeblogs@hostnameUSER1@hostname, 依此类推
  • 然后,命令 1 使用生成的sed表达式来处理 File2 中的所有替换。

相关内容