sed正则表达式失败

时间:2014-03-27 02:55:00

标签: regex bash 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
//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没有问题。我错过了什么?

3 个答案:

答案 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