我有內容的示例文件: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提供完整的解決方案;使用'-E'代替'-r'應該爲OP工作(順便說一句,'-E'也可以與GNU'sed'一起工作(作爲'-r'的別名),但沒有記錄)。 – mklement0
因此,如果我正確理解這一點,第一個sed節中的正則表達式基本上是說「找到所有以雙正斜槓開始的行,0個或多個不是」@「的字符,直到達到」@「,然後爲零或更多不是正斜槓的字符(記住這個模式),直到你得到一個正斜槓,然後有零個或多個不包含一個新行的字符,並用存儲的模式替換它並打印它「,對嗎?這很有道理,我只是想確保我完全理解模式背後的原因。 –
你已經明白了。 @ mklement0謝謝! – jthill