2014-11-04 119 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來做到這一點。 – 2014-11-04 00:35:52

+5

你不需要使用awk,你可以用Perl來做到這一點。 – TLP 2014-11-04 01:00:20

+0

你的數據庫文件非常大嗎? – TLP 2014-11-04 01:00:42

回答

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散列。