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 - Fatal编程技术网

基于变量的Bash计数

基于变量的Bash计数,bash,shell,Bash,Shell,我有一个名为ip的变量,它包含一个ip列表 $ echo $ip 218.25.208.92 218.25.208.92 53.170.26.175 8.135.72.164 244.105.203.71 211.118.89.4 100.29.91.148 187.225.13.147 48.204.157.1452 182.237.138.26 182.237.138.26 182.237.138.26 211.118.89.4 100.29.91.148 100.29.91.148

我有一个名为
ip
的变量,它包含一个ip列表

$ echo $ip
218.25.208.92 218.25.208.92 53.170.26.175 
8.135.72.164 244.105.203.71 211.118.89.4 
100.29.91.148 187.225.13.147 48.204.157.1452 182.237.138.26 182.237.138.26 182.237.138.26
211.118.89.4 100.29.91.148 100.29.91.148
我试图迭代这个字符串并找到重复超过2次的IP。如果IP重复两次以上,则显示找到IP的次数

我以为这可以用for循环来管理,但我完全迷路了

我尝试使用
grep-o
。它显示了IP出现的次数,但我必须手动指定每个IP

echo $ip | grep -o 218.25.208.92 | wc -l 
更新的代码:

for i in $ip; do
    echo $ip | grep -o $i | wc -l
done

在我的例子中,要计算IP出现在字符串上的次数是由 以下命令:

(IFS=""; sort <<< "$ip") | uniq -c
(IFS=“”;排序:

您缺少的关键部分是bash如何处理分隔词。bash提供了一个内部字段分隔符,默认为
IFS=$'\t\n'
space
tab
newline
)。当您需要访问单个词时,只需允许进行默认的词分隔

引号可防止分词。因此,要允许进行默认分词,必须使用
$ip
unquoted。无需生成单独的子shell来调用其他Linux实用程序,bash提供了所有您需要的内置功能

要简单地在每个单独的IP上进行迭代,您可以将
$IP
的内容作为列表进行循环,例如

for i in $ip; do
    # make use of $i any way you like
    echo $i
done
通过声明一个数组并用
$ip
初始化它,您可以简单地从
$ip
的内容创建一个数组,例如

array=( $ip )
如果您只想在自己的线路上分离每个IP,可以使用printf技巧,例如


其中,
printf
格式字符串,尽管有一个字符串转换说明符,将在单独的一行上耗尽每个IP的所有输入输出。

如果不这样做,请使用
uniq
,但仅使用bash:


IFS=$'\n'read-r-a ips-d''使用带有
-c
-d
选项的
uniq
命令。更好的
printf“%s\n”$ip | uniq-c
--无需更改默认的
IFS
。祝您的脚本编写好运!@DavidC.Rankin
IFS
在子shell中更改,因此不会造成持久的伤害。另一方面,未引用的
$ip
,会受到分词(好)和全局扩展(坏)的影响@JohnKugelman--是的,我明白了,我的目的是解释没有必要使用子shell--我想这就是我应该分阶段使用它的方式,而不仅仅是
“更好”
。关闭设置为-f的
全局搜索。请注意,不引用
$ip
意味着它要进行全局扩展。如果它包含
*
或其他通配符,则可以对其进行扩展。使用仅包含ip地址的变量是安全的,但对于包含arb的变量,我不建议这样做itrary文本或用户输入。是的,这是一个很好的补充。您可以安全地使用无引号的内容有一些限制。谢谢。
array=( $ip )
printf "%s\n" $ip