2013-01-17 38 views
0

我有以下的/ etc/hosts文件1班輪腳本來獲得服務器(使用ifconfig)的IP地址,並追加到主機名到/ etc/hosts文件進行匹配ip地址

[[email protected] tmp]# cat hosts 
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
119.13.248.1 ccvcds1.ihost.com vcds1 
171.221.160.11 vhost.ihost.com vhost41 


[[email protected] tmp]# echo $(ifconfig eth0 | grep "inet addr:" | cut -d ":" -f 2 | cut -d " " -f 1) 
171.221.160.11 

如何使用SED或AWK一條線將「AWSHOST」添加到匹配的ip線。所以改變將是:

[[email protected] tmp]# cat hosts 
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1   localhost localhost.localdomain localhost6 localhost6.localdomain6 
119.13.248.1 ccvcds1.ihost.com vcds1 
171.221.160.11 vhost.ihost.com vhost41 AWSHOST 

我試圖管輸出的上述命令sed和awk,它不工作。任何幫助非常感謝

回答

2
sed -i "/$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | cut -d' ' -f1)[ \t]/ s/$/ AWHOST/ " hosts 
+0

這是正確的,完美的工作。非常感謝:) – user1988058

+0

請注意,這可能會匹配您不想要的hosts文件中的行,因爲它將原始ip地址及其所有點傳遞到sed,就好像它是一個常規表達。如果你的'ifconfig'行返回127.0.0.10,這個命令將把主機名添加到127.0.0.1 –

+0

@RobDavis好點,我在末尾加了'[\ t]'來防止這一點。另外,管道序列可以用'|擴展sed's /\./\\./ g''來逃避這些點。 –

2

可以使用sed向此作爲這樣:

$ cat /etc/hosts 
127.0.0.1  localhost 
171.1.1.1 myhost 

$ sudo sed -i 's/\(171\.1\.1\.1\).*/&\ mynewhost/g' /etc/hosts 

$ cat /etc/hosts 
127.0.0.1  localhost 
171.1.1.1 myhost mynewhost 

的符號&將由捕獲表達例如被替換這裏171.1.1.1 myhost,然後你將追加到它的一個逃脫的空間和新的主機別名,這裏mynewhost

編輯

由於David Ravetti說你可以添加一個擴展被添加到備份文件,如果你不想要的文件被編輯到位。

sed -i .bak ......

那麼該文件將在地方進行編輯(您的編輯內容取代),但原來的文件將與.bak擴展備份。

+0

A注意OP,如果您不知道,sed -i表示編輯文件。如果您想在實驗時保留原始主機文件的備份,則可以輸入擴展名,如sed -i「.bak」。然後主機將包含處理的更新,hosts.bak將包含原始文件。 –

+1

我編輯了sed行來逃避這些點。寫入'171.1.1.1',該字符串也將匹配「171.121.115.42」。通過將點轉義爲'171 \ .1 \ .1 \ .1',它只會匹配文字點。 –

+0

我不知道服務器的IP地址,並使用以下命令返回:echo $(ifconfig eth0 | grep「inet addr:」| cut -d「:」-f 2 | cut -d「」-f 1 )| sed或awk。問題是當我使用sed時,我無法從前一個命令獲得回顯的輸出。主要問題是它需要是1班輪。 – user1988058

1

試試這個

sed -i "s/\(171.221.160.11\) \(.*\)/\1 \2 MYHOST/g" temp.txt

,這是awk

awk '{if ($1 == "171.221.160.11") {b=$1;for(i=1; i<=NF; ++i){$1="";a=a" "$i;}$0 =b" "a" ""MYHOST3" } print}' temp.txt > temp2.txt 

我無法決定該選什麼sedawk,所以現在我一直在做的兩者:)