引用符内の特定の文字を置き換える

引用符内の特定の文字を置き換える

ログファイルからいくつかの機密データをマスクしようとしています。

まず、一致するパターンを使用してファイル内の特定の行をフィルタリングする必要があります。その後、特定の行に対して二重引用符内のテキストを置き換え、二重引用符内にないテキストを保持する必要があります。

ファイル内のパターン(二重引用符を含む)に一致するすべての行と二重引用符内のすべての内容は、Xに変わるAZ、xに変わるaz、数字0から9を0に置き換える必要があります。

1行に複数の引用符付き文字列を使用できます。内部引用符は、「、」、「-」、「.」、「@」などの特殊文字である可能性があり、これらの文字はそのままにしてください。

サンプルファイルの内容(この例のフィルタワードは「KEYWORD」です):

2020-04-18 15:01:12 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "Replace This"}}} -> {:entry1 {:entry2 {:value "Replace ALSO this."}}}
2020-04-18 15:01:13 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "REplace. THIS 12345"}}}
2020-04-18 15:01:15 [EVENT] :this_has--the-KEYWORD: {:entry1 {:entry2 {:value "[email protected]"}}} -> {:entry1 {:entry2 {:value "[email protected]"}}}
2020-04-18 15:01:18 [EVENT] :log-event-without-keyword: {:entry1 {:entry2 {:value "Do NOT replace this."}}} -> {:entry1 {:entry2 {:value "Do-NoT replace this either"}}}

このファイルは入力として次の出力として扱われます。

2020-04-18 15:01:12 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "Xxxxxxx Xxxx"}}} -> {:entry1 {:entry2 {:value "Xxxxxxx XXXX xxxx."}}}
2020-04-18 15:01:13 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "XXxxxxx. XXXX 00000"}}}
2020-04-18 15:01:15 [EVENT] :this_has--the-KEYWORD: {:entry1 {:entry2 {:value "[email protected]"}}} -> {:entry1 {:entry2 {:value "[email protected]"}}}
2020-04-18 15:01:18 [EVENT] :log-event-without-keyword: {:entry1 {:entry2 {:value "Do NOT replace this."}}} -> {:entry1 {:entry2 {:value "Do-NoT replace this either"}}}

変更された行はファイル内で更新する必要があり、変更されたファイル全体は標準出力(キーワード、行順序などのないファイルも含む)として処理する必要があります。詳細は保存する必要があります。

grepやsedなどのbashスクリプト/コマンドラインツールを使用してこれを実行できますか?

ベストアンサー1

awk '/KEYWORD/{
    n=split($0,a,"\"")
    for(i=2;i<=n;i=i+2){
        gsub(/[A-Z]/,"X",a[i])
        gsub(/[a-z]/,"x",a[i])
        gsub(/[0-9]/,"0",a[i])
    }
    sep=""
    for (i=1;i<=n;i++){
        printf "%s%s",sep,a[i]
        sep="\""
    }
    printf "\n"
    next
}
1' file

たとえば、更新された入力ファイルから

2020-04-18 15:01:12 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "Replace This"}}} -> {:entry1 {:entry2 {:value "Replace ALSO this."}}}
2020-04-18 15:01:13 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "REplace. THIS 12345"}}}
2020-04-18 15:01:15 [EVENT] :this_has--the-KEYWORD: {:entry1 {:entry2 {:value "[email protected]"}}} -> {:entry1 {:entry2 {:value "[email protected]"}}}
2020-04-18 15:01:18 [EVENT] :log-event-without-keyword: {:entry1 {:entry2 {:value "Do NOT replace this."}}} -> {:entry1 {:entry2 {:value "Do-NoT replace this either"}}}

この awk は所望の出力を生成します。

2020-04-18 15:01:12 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "Xxxxxxx Xxxx"}}} -> {:entry1 {:entry2 {:value "Xxxxxxx XXXX xxxx."}}}
2020-04-18 15:01:13 [EVENT] :log-event-with-KEYWORD: {:entry1 {:entry2 {:value "XXxxxxx. XXXX 00000"}}}
2020-04-18 15:01:15 [EVENT] :this_has--the-KEYWORD: {:entry1 {:entry2 {:value "[email protected]"}}} -> {:entry1 {:entry2 {:value "[email protected]"}}}
2020-04-18 15:01:18 [EVENT] :log-event-without-keyword: {:entry1 {:entry2 {:value "Do NOT replace this."}}} -> {:entry1 {:entry2 {:value "Do-NoT replace this either"}}}

おすすめ記事