2012-07-24 263 views
0

好了,所以我试图找出是我如何计算一个串周期数,然后切一切到这一点,但减去2含义是这样的:统计字符串中出现的次数。 Linux的

string="aaa.bbb.ccc.ddd.google.com" 

number_of_periods="5" 

number_of_periods=`expr $number_of_periods-2` 

string=`echo $string | cut -d"." -f$number_of_periods` 

echo $string 

result: "aaa.bbb.ccc.ddd" 

的方式,我想这样做是发送字符串到一个文本文件,然后就greping为几次都是这样的数量:

grep -c "." infile 

的原因,我不想这样做,是因为我想避免创建另一个文本文件我没有权限这样做。对于我正在尝试构建的代码来说,这也会更简单。

编辑

我不认为我说得很清楚,但我想使找到时期更加动态的数字,因为我定定地看着将作为脚本更改地址向前移动。

回答

4

如果你不需要点,但只是删除倒数第二点和所有事后,你可以使用Bash的内置string manuipulation

${string%substring}$string删除的$substring最短的匹配。

例子:

$ string="aaa.bbb.ccc.ddd.google.com" 
$ echo ${string%.*.*} 
aaa.bbb.ccc.ddd 

尼斯和简单,不需要sedawkcut

+1

整齐漂亮,我不知道这(我用'tcsh',这不幸的是不会与它的工作,因此,我更普遍的'awk'方法) - 当然不是OP的问题,因为它被标记为'bash'。非常好。 – Levon 2012-07-24 12:55:53

+0

@Levon:当我可以的时候,我[避免使用脚本(t)csh](http://www.grymoire.com/Unix/CshTop10.txt)。如果必须,我会使用**'sed' **:'echo“aaa.bbb.ccc.ddd.google.com”| sed's/\(。[^。] * \)\ {2 \} $ //'' – Johnsyweb 2012-07-24 13:04:56

+0

@Levon:'echo“aaa.bbb.ccc.ddd.google.com”| sed's /. [^.]*.[^.]*$//''更短:-) – Johnsyweb 2012-07-24 13:09:29

0

或许这将帮助:

#!/bin/sh 

input="aaa.bbb.ccc.ddd.google.com" 

number_of_fields=$(echo $input | tr "." "\n" | wc -l) 
interesting_fields=$(($number_of_fields-2)) 

echo $input | cut -d. -f-${interesting_fields} 
2

这个怎么样:

echo "aaa.bbb.ccc.ddd.google.com"|awk 'BEGIN{FS=OFS="."}{NF=NF-2}1' 

(由@steve帮助的注释进一步缩短)给出:

aaa.bbb.ccc.ddd 

awk命令:

awk 'BEGIN{FS=OFS="."}{NF=NF-2}1' 

作品通过分离由.输入线到字段(FS),然后将它们连接为具有.输出(OFS),但字段(NF)的数量已经减少了2。最终1在命令中负责打印。

这将通过消除最后两个时期分隔的项目来减少给定的输入行。

这种做法是“壳不可知” :)

+1

+1这是我最喜欢的解决方案,因为如果数字的字段非常大?此外,你可以缩短一些:'awk'BEGIN {OFS = FS =“。”} {NF = NF-2} 1'' – Steve 2012-07-24 13:04:11

+0

@steve ..谢谢..如果你不这些调整的心态..我用过他们这样或那样,但由于某些原因,他们没有发生在我身上,因为我把这一起iterativley(并慢慢地:) – Levon 2012-07-24 13:06:15

+1

+1:整洁,很好地解释,壳 - 不可知论的方法。 – Johnsyweb 2012-07-24 13:10:37

0
grep -o "\." <<<"aaa.bbb.ccc.ddd.google.com" | wc -l 
5 
相关问题