2011-02-24 94 views
1

我很難將CentOS 5.5中的正則表達式轉換爲工作sed命令。使用正則表達式和sed篩選出IP

我要過濾的IP地址了一個字符串:

"example.org has address 123.45.67.890" -> "123.45.67.890" 

我的正則表達式到目前爲止是:

/([a-zA-Z\. ]+)([0-9\.]+)/ 

並採用SED我的命令的例子是:

host example.org | grep 'has address' | sed 's/\([a-zA-Z\\. ]+\)\([0-9\\.]+\)/\2/' 

但是,我從該命令中得到的所有信息都是sed的輸入:「example.org的地址爲123.45.67.890」

任何想法?

+0

此應用程序位於unix **用戶**站點不是編程站點,因爲sed是標準命令行工具 – 2011-02-25 14:49:13

回答

4
host example.org | awk '/has address/ {print $4 }' 
1

對此,您並不需要sed。你可以使用cut,而不是解析空間:

host example.org | grep 'has address' | cut -d' ' -f4 

這只是需要4個字,當使用空格分隔。

0

您的([a-zA-Z\. ]+)捕獲IP地址之前的所有內容並將其包含在匹配中。如果域名中包含任何數字,也會導致匹配失敗。使用後視:

/(?<has address)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ 

你顯然need to use Perl mode for sed to support lookbehinds。你也可以使用捕獲組。如果你想要一個更挑剔模式(即只匹配的東西,看上去很強健,像IP地址),你可以試試這個:

/(?<has address)(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\b/ 

應該從0-255匹配四個數字,用點分隔並在其前'有地址'。

+0

Perl模式適用於稱爲'ssed'的'sed'的定製版本。 – 2011-02-24 20:30:41

2

這裏有一個很簡單的方法來做到這一點沒有一個正則表達式:

host example.org | grep "has addres" | awk '{print $4}' 
0

使用GNU grep

host example.org | grep -Po '.*has address \K[0-9.]*' 
0

主機exmaple.org | sed -n's /^.*(。*)$/\ 1/p'