2012-02-27 115 views
0

我在一個存儲爲變量的bash腳本中有一大串IP地址。
我的問題是:如何驗證字符串中的所有IP都顯示相同的次數?如果這有所幫助,則所有IP的發生在字符串中的次數也存儲爲變量。在字符串中查找重複的項目

下面是一個例子向你展示我的意思:

String "4.2.2.2 8.8.8.8 4.2.2.2 4.2.2.2 8.8.8.8 8.8.8.8" 

將確定

String "1.1.1.1 2.2.2.2 1.1.1.1 2.2.2.2 2.2.2.2" 

,因爲也有2.2.2.2 3個實例和兩個1.1.1.1

String "4.4.4.4 3.3.3.3 2.2.2.2" 
不會是OK

可以,因爲他們都在那裏一次。

+2

的,什麼是你到目前爲止試試? – netcoder 2012-02-27 21:09:11

+0

爲什麼第一個字符串沒問題,所有的值在那裏回顯3次? – 2012-02-27 21:12:38

+0

我試着用sort排序字符串以增加IP列表,然後用'grep -c'檢查列表中的前n個IP是否相同,但它根本不起作用。 – conorao 2012-02-27 21:13:38

回答

3
s="4.2.2.2 8.8.8.8 4.2.2.2 4.2.2.2 8.8.8.8 8.8.8.8" 
n=`echo $s | tr " " "\n" | wc -l` 
nuniq=`echo $s | tr " " "\n" | sort | uniq | wc -l` 
[ $n -eq $nuniq ] || echo "we've got duplicates" 

echo $s | tr " " "\n" | sort | uniq -c | grep -qv '^ *1 ' && echo "duplicates!" 
+0

完美地工作!謝謝! – conorao 2012-02-27 21:33:47

0

這裏有一個簡單的方法,使用bash和awk來做到這一點:

(for ip in $string; do echo $ip; done) | sort | uniq -c | awk 'BEGIN{badString=0}; $1!=1{badString=1} END{if(badString == 1) { print "This was a bad string!"}}' 

在字:串入不同的線路,對它們進行排序在拆分每個IP,請檢查該列表是通過計算獨特每個IP地址的出現,然後打印「這是一個錯誤的字符串」,如果有任何計數不是一個。

我只做到了這種方式,因爲你用「打擊」和「殼」,但存在更簡單的Perl單行做到這一點:)

0

你可以使用:

$ STR="4.2.2.2 8.8.8.8 4.2.2.2 4.2.2.2 8.8.8.8 8.8.8.8" 
$ echo $STR | tr " " "\n" | sort | uniq -c | grep -v " 1 " 
    3 4.2.2.2 
    3 8.8.8.8 
$ STR="4.4.4.4 3.3.3.3 2.2.2.2" 
$ echo $STR | tr " " "\n" | sort | uniq -c | grep -v " 1 " 
$ 

(無輸出=> OK,產量=>不正常)。

$ STR="4.2.2.2 8.8.8.8 4.2.2.2 4.2.2.2 8.8.8.8 8.8.8.8" 
$ ISOK=`echo $STR | tr " " "\n" | sort | uniq -c | grep -v " 1 "` 
$ if [[ -z $ISOK ]]; then echo "Is OK"; fi 
$ 
相關問題