2014-11-04 2 views
1

У меня есть список ips или имен хостов, и я хочу сравнить их с моей базой данных, я пытаюсь сделать это через командную строку, и я сломаю ее.Подпись для командной строки perl

мой список IP выглядит следующим образом

10.0.0.1 
10.1.1.1 
10.2.2.2 
hostname-as-12 
... etc 

моя база данных выглядит так:

hostname:ip:location:contact 

псевдо-код, как

open iplist 
compare to database 
replace inline iplist with new information 

я хочу сделать это из командной строки (если ничего не узнать о его использовании)

В настоящее время моя командная строка выглядит следующим образом:

perl -i.back -pe 's/^(.+)$/$1:`grep $1 /directory/tmp/datbase.txt` | cut -d : -f2`/' iplist 

так, то IPList будет изменен, как этот

10.0.0.1:10.0.0.1 
10.1.1.1:10.1.1.1 
10.2.2.2:   #case not found 
hostname-as-12:10.3.3.3 
+0

Вам не нужно использовать регулярное выражение или perl, вы можете сделать это с помощью awk. –

+5

Вам не нужно использовать awk, вы можете сделать это с помощью Perl. – TLP

+0

Является ли ваш файл базы данных очень большим? – TLP

ответ

0

В командной строке Perl вы можете использовать BEGIN блок для создания хэш-первых на Начало. Модуль File::Slurp дает вам ярлык для чтения файла базы данных.

Дополнительный -l параметр добавляет символ новой строки после каждой печати, так что вы можете спокойно chomp вход & использовать его в качестве хэш-ключа, без необходимости помнить, чтобы включить дополнительный символ новой строки в выводе:

perl -i.back -MFile::Slurp -ple 'BEGIN { %db = map {m/^([^:]+):([^:]+)/; ($2 => $1)} read_file("/directory/tmp/database.txt") } chomp; $_ .= ":" . $db{$_} || ""' iplist 

Тест:

$ cat iplist 
10.0.0.1 
10.1.1.1 
10.2.2.2 
hostname-as-12 
$ cat db.txt 
10.0.0.1:10.0.0.1:foo:bar 
10.1.1.1:10.1.1.1:foo:bar 
10.3.3.3:hostname-as-12:foo:bar 
$ perl -i.back -MFile::Slurp -ple 'BEGIN { %db = map {m/^([^:]+):([^:]+)/; ($2 => $1)} read_file("db.txt") } chomp; $_ .= ":" . $db{$_} || ""' iplist 
$ cat iplist 
10.0.0.1:10.0.0.1 
10.1.1.1:10.1.1.1 
10.2.2.2: 
hostname-as-12:10.3.3.3 
$ 

Без File::Slurp модуля вам просто нужно будет открыть и прочитать файл, как обычно, в том же BEGIN блок, для заполнения хэша %db.

Смежные вопросы