2014-03-27 131 views
1

我有內容的示例文件:SED正則表達式失敗

Filesystem           512-blocks  Used Available Capacity iused  ifree %iused Mounted on 
/dev/disk0s2          467182912 419318824 47352088 90% 52478851 5919011 90% /
devfs              419  419   0 100%  727   0 100% /dev 
/dev/disk1s2          975093952 673515008 301578944 70% 84189374 37697368 69% /Volumes/Local_Storage 
map -hosts             0   0   0 100%   0   0 100% /net 
map auto_home            0   0   0 100%   0   0 100% /home 
localhost:/l3ZTI82fIEDeEEIvUkf44A     467182912 467182912   0 100%   0   0 100% /Volumes/MobileBackups 
/dev/disk2s2          1952853344 1925763856 27089488 99% 240720480 3386186 99% /Volumes/SK Backup 
/dev/disk3s2          199328216 88909928 110418288 45% 11113739 13802286 45% /Volumes/Secure_Storage 
/dev/disk4s2           59328216 51456432 7871784 87% 6432052  983973 87% /Volumes/Secure 
/dev/disk5s2           60000000 12713448 47286552 22% 1589179 5910819 21% /Volumes/Secure_Personal 
//[email protected]/Storage 4294701048 1128302984 3166398064 27% 141037871 395799758 26% /Volumes/Storage 
/dev/disk6s2           200000  9952  190048  5%  1242  23756 5% /Volumes/VAULT 
//[email protected]/chris.s   467182912 437521864 29661048 94% 54690231 3707631 94% /Volumes/chris.schmitz 
//[email protected]/NET    167563256 50264576 117298680 30%   0 18446744073709551615 0% /Volumes/NETLOGON 

而且我的工作從文件拉出只是IP地址和主機名。現在我正在使用下面的模式抓住了IPS:

cat dfsample.txt | awk '/@/' | sed -E 's/.*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/g' 

意想不到的結果:

//[email protected]/Storage 4294701048 1128302984 3166398064 27% 141037871 395799758 26% /Volumes/Storage 
2.20.1.76 
//[email protected]/NET    167563256 50264576 117298680 30%   0 18446744073709551615 0% /Volumes/NETLOGON 

我對sed的部分期望是,.*之前和定義的模式後, parens會選擇整條線,當我使用\1替代在parens中發現的模式的線時,它會用找到的模式替換整條線,只留下ip地址。

由於某種原因,我的IP地址的前兩位數字被切斷。當我嘗試在崇高的模式在崇高它發現IP沒有問題。我錯過了什麼?

回答

1
sed -nr 's,^//[^@/]*@([^/]*)/.*,\1,p' 

獲取主機名和IP地址,並且不會被「有趣的」卷名所迷惑。

如果您的SED沒有r標誌,轉義是不是在這一個太醜陋了,我也許應該給它只是這樣說:

sed -n 's,^//[^@/]*@\([^/]*\)/.*,\1,p' 

(編輯:[^@] - >[^@/]安全播放)

+0

+1提供完整的解決方案;使用'-E'代替'-r'應該爲OP工作(順便說一句,'-E'也可以與GNU'sed'一起工作(作爲'-r'的別名),但沒有記錄)。 – mklement0

+0

因此,如果我正確理解這一點,第一個sed節中的正則表達式基本上是說「找到所有以雙正斜槓開始的行,0個或多個不是」@「的字符,直到達到」@「,然後爲零或更多不是正斜槓的字符(記住這個模式),直到你得到一個正斜槓,然後有零個或多個不包含一個新行的字符,並用存儲的模式替換它並打印它「,對嗎?這很有道理,我只是想確保我完全理解模式背後的原因。 –

+0

你已經明白了。 @ mklement0謝謝! – jthill

2

問題是,您sed默認情況下會打印行,無論模式匹配與否。使用-n禁用的模式空間和p自動打印功能在當前模式空間:

sed -En '/@/{s/.*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/p;}' inputfile 

這將產生2.20.1.76您的輸入。另外請注意,您不需要管道awk來過濾數據。

+0

+1;爲了使它在OSX上工作,'''必須在關閉'}'之前執行(或者,不要將's'命令放在'{...}'中)。 – mklement0

+0

@ mklement0 BSD sed現在應該很開心':)' – devnull

+0

:) OP沒有這麼明確地說,但是'-E'的使用表明OSX/BSD。 – mklement0

1

這裏是如何與awk

awk '/@/ {split($1,a,"[@/]");print a[4]}' file 
SK-HQ-SRV05.internal.com 
172.20.1.76 
hq-srv03 

此找到所有線無線做然後分割線@/
然後它從分割打印部分4