2012-02-27 3 views
0

У меня есть большая строка IP-адресов в скрипте bash, хранящемся как переменная.
Мой вопрос: Как я могу проверить, что все 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" 

не будет хорошо, потому что есть 3 экземпляра 2.2.2.2 и два из 1.1.1.1

String "4.4.4.4 3.3.3.3 2.2.2.2" 

было бы в порядке, потому что они все были там один раз.

+2

А что вы пытались до сих пор? – netcoder

+0

Почему первая строка в порядке, все значения эхом повторяются 3 раза? –

+0

Я попытался сортировать строку, чтобы сделать список IP в порядке возрастания, используя 'sort', а затем проверить, были ли первые 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

Вот простой способ сделать это с Баш и 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, с выходом => Не 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 
$ 
Смежные вопросы