Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 查找字符串中的重复项_Bash_Shell_Scripting - Fatal编程技术网

Bash 查找字符串中的重复项

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.

我在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.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
$