2012-07-24 320 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 
相關問題