Bash 查找字符串中的重复项
我在bash脚本中有一大串IP地址存储为变量Bash 查找字符串中的重复项,bash,shell,scripting,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" 不正常,因为有3个2.2.2.2实例和两个1.1.1 String "4.4.4.
我的问题是:如何验证字符串中的所有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
String "4.4.4.4 3.3.3.3 2.2.2.2"
没关系,因为它们都在里面一次 使用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 one行程序可以做到这一点:)这里有一个简单的方法来使用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 one行程序可以做到这一点:)
或
或
您可以使用:
$ 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"
$ 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 "
$
(无输出=>正常,输出=>不正常)
或
为什么第一个字符串没有问题,所有的值都在那里回响了3次?我尝试用
sort
对字符串进行排序,以按递增顺序列出IP,然后用grep-c
检查所述列表中的前n个IP是否相同,但是它根本不起作用。@Shiplu-第一个是可以的,因为每个IP在字符串中出现的次数相同。类似地,对于一个有40个相同两个IP实例的字符串,它也可以。为什么第一个字符串可以,所有的值都在那里回显3次?我尝试使用sort
对字符串进行排序,以按递增顺序列出IP,然后使用grep-c
检查所述列表中的前n个IP是否相同,但是它根本不起作用。@Shiplu-第一个是可以的,因为每个IP在字符串中出现的次数相同。类似地,对于具有相同两个IP的40个实例的字符串,也可以。
$ 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
$