我有一个包含内容的示例文件:
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
//chris@SK-HQ-SRV05.internal.com/Storage 4294701048 1128302984 3166398064 27% 141037871 395799758 26% /Volumes/Storage
/dev/disk6s2 200000 9952 190048 5% 1242 23756 5% /Volumes/VAULT
//chris@172.20.1.76/chris.s 467182912 437521864 29661048 94% 54690231 3707631 94% /Volumes/chris.schmitz
//chris@hq-srv03/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'
意外结果:
//chris@SK-HQ-SRV05.internal.com/Storage 4294701048 1128302984 3166398064 27% 141037871 395799758 26% /Volumes/Storage
2.20.1.76
//chris@hq-srv03/NET 167563256 50264576 117298680 30% 0 18446744073709551615 0% /Volumes/NETLOGON
我对sed部分的期望是,在parens中定义的模式之前和之后的.*
将选择整行,并且当我使用{{1}替换parens中找到的模式的行时它会用找到的模式替换整行,只留下ip地址。
由于某种原因,我的IP地址的前两位数字被切断了。当我在sublime中尝试parens中的模式时,它会发现ip没有问题。我错过了什么?
答案 0 :(得分: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
管道来过滤数据。
答案 1 :(得分:1)
sed -nr 's,^//[^@/]*@([^/]*)/.*,\1,p'
获取主机名和IP地址,并且不会被有趣的"愚弄卷名。
如果你的sed没有r
标志,那么逃脱并不是太难看了,我可能应该这样做:
sed -n 's,^//[^@/]*@\([^/]*\)/.*,\1,p'
(编辑:[^@]
- > [^@/]
安全游戏)
答案 2 :(得分:1)
以下是awk
awk '/@/ {split($1,a,"[@/]");print a[4]}' file
SK-HQ-SRV05.internal.com
172.20.1.76
hq-srv03
这会找到包含@
的所有行,然后将该行拆分为@
或/
然后它会从分割中打印部分4
。