2012-02-27 13 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" 

はOKだろう

String "1.1.1.1 2.2.2.2 1.1.1.1 2.2.2.2 2.2.2.2" 

3つの2.2.2.2のインスタンスと1.1.1.1

String "4.4.4.4 3.3.3.3 2.2.2.2" 
の二つがありますので、OKではないでしょう

は一度そこにすべて入っているので問題ありません。

+2

そして、あなたがこれまでにしようとしましたか? – netcoder

+0

なぜ最初の文字列は大丈夫ですか、すべての値はそこに3回エコーされますか? –

+0

'sort 'を使ってIPのリストを昇順に並べ替えるために文字列をソートしようとしましたが、リストの最初のn個のIPが' grep -c'を使って同じであるかどうかを確認しました。 – conorao

答えて

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

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アドレスの出現数を計算し、カウントが1でなければ "This is bad string"と表示します。

あなたが「bashの」とでタグ付けされたので、私は唯一の「殻」と、それをこのようにやったが、これを行うにはワンライナーは、はるかに簡単な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、出力を持つ=>未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 
$ 
関連する問題