我有一个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等,那么只保留最后两部分。
如果这违反协议,请告知如何进行跟进。
答案 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 - >子串提取