Как я могу заменить строки из одного файла, совпадающие со строками из другого файла, на основе сопоставления с шаблоном, на grep / sed / awk? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть два файла nmap.txt и hosts.txt . Первый - это, конечно, результат поиска nmap, и он выглядит так:

 ====================================
 192.168.2.1     (ComputerName1)
 Running: Microsoft Windows Vista/7/8
 ====================================
 192.168.2.2     (ComputerName2)
 Running: Running: Linux 3.X
 ====================================
 192.168.2.3     ()
 ====================================
 192.168.2.4     ()

Это выглядит так, потому что нет записей DNS для 3-го и 4-го компьютеров, и nmap не смог на 100% определить их операционные системы. Но у меня есть имена компьютеров 3 и 4 в файле hosts.txt.

192.168.2.3     (ComputerName3)
192.168.2.4     (ComputerName4)

Какой самый простой способ заменить отсутствующие имена компьютеров в nmap.txt (192.168.2.3 и 192.168.2.4) их соответствующими именами в hosts.txt?

Я пытался grep -v -F -f nmap.txt hosts.txt> output.txt , который будет выводить только отсутствующие имена компьютеров, например:

192.168.2.3     (ComputerName3)
192.168.2.4     (ComputerName4)

Но это не то, что я хочу. Вывод должен выглядеть так:

====================================
192.168.2.1     (ComputerName1)
Running: Microsoft Windows Vista/7/8
====================================
192.168.2.2     (ComputerName2)
Running: Running: Linux 3.X
====================================
192.168.2.3     (ComputerName3)
====================================
192.168.2.4     (ComputerName4)

Может быть, что-то с во время чтения строки , но я не эксперт. Любая помощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

В awk:

$ awk 'NR==FNR{a[$1]=$0;next}{print ($1 in a?a[$1]:$0)}' hosts nmap

Вывод:

====================================
192.168.2.1     (ComputerName1)
Running: Microsoft Windows Vista/7/8
====================================
192.168.2.2     (ComputerName2)
Running: Running: Linux 3.X
====================================
192.168.2.3     (ComputerName3)
====================================
192.168.2.4     (ComputerName4)

Объяснено:

$ awk '
NR==FNR {                     # process the hosts file
    a[$1]=$0                  # hash records to a using ip as key
    next
}
{                             # process nmap file
    print ($1 in a?a[$1]:$0)  # print hashed record instead if it exists
}' hosts nmap
0 голосов
/ 16 сентября 2018
$ awk 'NR==FNR{map[$1]=$2;next} ($1 in map) && sub(/\(\)$/,""){$0=$0 map[$1]} 1' hosts.txt nmap.txt
====================================
192.168.2.1     (ComputerName1)
Running: Microsoft Windows Vista/7/8
====================================
192.168.2.2     (ComputerName2)
Running: Running: Linux 3.X
====================================
192.168.2.3     (ComputerName3)
====================================
192.168.2.4     (ComputerName4)
...