

IPアドレスとnameを照らし合わせたcsvファイルを使用して別のファイルの中身のIPをnameに置き換えられたらなと…

IPアドレスとnameのファイルの中身を表示させて、そこからreadコマンドやsedコマンドでIPとnameを変換させる文を書いたのですが上手くできてなくて…

例として、以下のような照し合わせファイルを使用し、ログにある 192.168.0.1 を yamada に、 192.168.0.2 を satou
に変換するといったものが、Linuxで実現できたらなと考えております。よろしくお願いします。

[code]

    192.168.0.1, yamada
    192.168.0.2, satou
    192.168.0.3, tanaka
    192.168.0.4, adachi
    192.168.0.5, saitou
    
[/code]


CC BY-SA 4.0
2023-07-27T01:35:48.100
95774
2023-08-05T06:27:21.237
2023-08-01T01:06:01.917
3060
59269
question
linux shell
IPアドレスとnameの対応表を使用して、別のファイルのIPアドレスを置換したい


以下は `awk` を利用する例です。

**trans_tbl.csv(変換表)**

[code]

    192.168.0.1,host_a
    192.168.0.2,host_b
    192.168.0.3,host_c
    192.168.0.4,host_d
    192.168.0.5,host_e
    
[/code]

**ip_addresses.csv(変換対象のIPアドレス)**

[code]

    192.168.0.4
    192.168.0.2
    192.168.0.1
    192.168.0.5
    192.168.0.3
    
[/code]

**awk スクリプト**

[code]

    #!/bin/bash
    
    trans_tbl='trans_tbl.csv'
    ip_addresses='ip_addresses.csv'
    
    awk -F, 'FNR==NR{ip[$1]=$2;next};$1 in ip{$1=ip[$1]}1' "$trans_tbl" "$ip_addresses"
    
    # host_d
    # host_b
    # host_a
    # host_e
    # host_c
    
[/code]


CC BY-SA 4.0
2023-07-27T04:33:27.257
95776
2023-07-27T04:33:27.257
47127
95774
answer


とても重要なことですが、 **ログとcsvファイルを指定しただけでとログの該当箇所を置換してくれるような都合の良いコマンドは予め用意されていません。**  
ですから自分の手でどうにかする必要があります。

処理の手順としては以下のようになりそうです。

  1. csvの読み取る行を決定する、もし最後の行まで読み終えていたら処理の一番最後へ
  2. csvから1行読み込み、置換対象のIPと置換する文字列を変数に入れる(仮に`IP`と`NAME`とします)
  3. ログの中にある`IP`を`NAME`に置換する
  4. 1に戻る
  5. 処理を終える

さて、最初に決めるべきは使う道具です。  
個人的にはプログラムでテキスト処理をすると聞くと`python`や`perl`が思い浮かびますが、それほど複雑なことをやるわけではないので質問者さんの手に馴染むものがあるならおそらくそれでもできるかと思います。  
しかし、置換する`IP`が10個くらいまでで同様の置換を何回もやる必要がないなら、手に馴染んでいるテキストエディタで置換するほうが手軽である可能性もあります。

使用する言語を決めてプログラムで処理することにしたなら、先に書いたような処理の流れになるようにすればいいと思います。

もし"そんなことを言われてもわからない"ということでしたらもう少し問題を分割する必要があります。  
例えば、"csvファイルの最初の行から最後の行までを読み込んでそれぞれの行を出力するプログラム"とか"ログファイルを読み込んで適当な文字列を置換するプログラム"とかを実際に書いてみて、できない/わからないところを書きかけの/期待通りに動いてくれないプログラムと一緒に別の質問として投稿していただければ回答してくださる方がいらっしゃるかもしれません。


CC BY-SA 4.0
2023-07-31T03:13:52.300
95808
2023-07-31T03:13:52.300
25936
95774
answer


プログラム言語は何でもいいですが例えば PHPだとこうなります

[code]

    <?php
        $data = [] ;
        if($fp = fopen('table.csv','r')){
            while($line=fgetcsv($fp)){
                if(count($line) == 2){
                    $ip = trim($line[0]) ;
                    $name = trim($line[1]) ;
                    $data[$ip] = $name ;
                }
            }
            fclose($fp);
        }
    
        echo $data['192.168.0.1'] . "\n" ;
        echo $data['192.168.0.2'] . "\n" ;
    
[/code]


CC BY-SA 4.0
2023-08-05T06:27:21.237
95851
2023-08-05T06:27:21.237
59393
95774
answer