如何删除除FQDN的最后3个部分之外的所有部分?

时间:2017-07-04 08:19:30

标签: bash awk sed cut

我有一个IP查找列表,我希望删除除最后3个部分之外的所有部分,因此: 98.254.237.114.broad.lyg.js.dynamic.163data.com.cn 会成为 163data.com.cn

我花了几个小时寻找线索,包括参数替换,但我得到的最接近的是:

$ string="98.254.237.114.broad.lyg.js.dynamic.163data.com.cn"
$ string1=${string%.*.*.*}
$ echo $string1

这让我反复回答: 98.254.237.114.broad.lyg.js.dynamic 这是除了最后3部分之外的一切。

执行列表的脚本会比我在这里的静态示例更好。 使用CentOS 6,我不介意它是否使用sed,cut,awk等等。 任何帮助表示赞赏。

谢谢,既然我有工作答案,我可以要求作为后续处理然后处理结果列表,如果最后一部分(在最后'。'之后)是3个字符 - 例如.com .net等,那么只保留最后两部分。

如果这违反协议,请告知如何进行跟进。

5 个答案:

答案 0 :(得分:2)

echo $string | awk -F. '{ if (NF == 2) { print $0 } else { print $(NF-2)"."$(NF-1)"."$NF } }'

NF表示由"分隔的字段总数。"所以我们想要最后一块(NF),最后但是1(NF-1)和最后但是2(NF-2)

答案 1 :(得分:2)

如果支持在另一个参数扩展中进行参数扩展,则可以使用:

string tmp = myTextbox.Text;
int val1 = int.Parse(tmp);
double val2 = Double.Parse(tmp); 

也可以反转该行,获取必填字段然后再反转..这样可以更容易地使用更改号码

$ s='98.254.237.114.broad.lyg.js.dynamic.163data.com.cn'
$ # removing last three fields
$ echo "${s%.*.*.*}"
98.254.237.114.broad.lyg.js.dynamic
$ # pass output of ${s%.*.*.*} plus the extra . to be removed
$ echo "${s#${s%.*.*.*}.}"
163data.com.cn

答案 2 :(得分:1)

$ echo $string | awk -F'.' '{printf "%s.%s.%s\n",$(NF-2),$(NF-1),$NF}'
163data.com.cn

简要说明,

  • 将字段分隔符设置为.
  • 使用awk参数$(NF-2), $(NF-1),and $NF打印最后3个字段。

还有另外一种选择,

$ echo $string | awk -v FPAT='[^.]+.[^.]+.[^.]+$' '{print $NF}'
163data.com.cn

答案 3 :(得分:1)

听起来这就是你所需要的:

awk -F'.' '{sub("([^.]+[.]){"NF-3"}","")}1'

e.g。

$ echo "$string" | awk -F'.' '{sub("([^.]+[.]){"NF-3"}","")}1'
163data.com.cn

但只有1个输入/输出样本,这只是猜测。

根据你的后续问题,这可能是你要求的:

$ echo "$string" | awk -F'.' '{n=(length($NF)==3?2:3); sub("([^.]+[.]){"NF-n"}","")}1'
163data.com.cn

$ echo 'www.google.com' | awk -F'.' '{n=(length($NF)==3?2:3); sub("([^.]+[.]){"NF-n"}","")}1'
google.com

答案 4 :(得分:0)

仅使用bash的版本:

echo $(expr "$string" : '.*\.\(.*\..*\..*\)')

要将其与文件一起使用,您可以使用xargs进行迭代:

文件:

head list.dat
98.254.237.114.broad.lyg.js.dynamic.163data.com.cn
98.254.34.56.broad.kkk.76onepi.co.cn
98.254.237.114.polst.a65dal.com.cn

迭代整个文件:

cat list.dat | xargs -I^ -L1 expr "^" : '.*\.\(.*\..*\..*\)'

注意:它在大规模上效率不高,所以你需要自己考虑它是否足够好。

Regexp解释:

.*  \.  \(  .*  \.  .*  \.  .*   \)
\___|    |       |       |        |
    |    \------------------------/> brakets shows which part we extract
    |            |       |
    |            \-------/> the \. indicates the dots to separate specific number of words
    |
    |
    -> the rest and the final dot which we are not interested in (out of brakets)

细节: http://tldp.org/LDP/abs/html/string-manipulation.html - >子串提取