在字符串中查找重复项

时间:2012-02-27 21:06:30

标签: bash shell scripting

我在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"

会好的,因为他们都在那里。

3 个答案:

答案 0 :(得分: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!"

答案 1 :(得分: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地址的出现次数来检查列表是否唯一,然后打印"这是一个错误的字符串"如果有任何计数不是一个。

我之所以这样做,是因为你标记了" bash"和" shell,"但是存在更简单的perl单行来做到这一点:)

答案 2 :(得分: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 "
$

(没有输出=>好的,输出=>不行)。

$ 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
$