Arrays 将结果放入数组

Arrays 将结果放入数组,arrays,shell,grep,Arrays,Shell,Grep,我想使用此函数计算给定文件中的IP数,IP应放入数组中,以便稍后使用,但我得到“declare:not found”和“cnt+=1:not found”,这是为什么 #!/bin/bash searchString=$1 file=$2 countLines() { declare -a ipCount cnt=0 while read line ; do ((cnt+=1)) ipaddr=$( echo "$line" | gr

我想使用此函数计算给定文件中的IP数,IP应放入数组中,以便稍后使用,但我得到“declare:not found”和“cnt+=1:not found”,这是为什么

#!/bin/bash
searchString=$1
file=$2

countLines()
{
    declare -a ipCount
    cnt=0

    while read line ; do
        ((cnt+=1))

        ipaddr=$( echo "$line" | grep -o -E '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' )

        ((ipCount[$ipaddr]+=1))
    done

    for ip in ${ipCount[*]}
    do
        printf "%-15s %s\n" "$ip" "${ipCount[$ip]}"
    done

    echo "total count=$cnt"
}

if [ $# -lt 2 ]; then
    echo "missing searchString and file"
else
    grep "$searchString" $file | countLines
fi
这是我正在尝试的测试文件的一部分

Apr 25 11:33:21 Admin CRON[2792]: pam_unix(cron:session): session opened for user 192.168.1.2 by (uid=0)
Apr 25 12:39:01 Admin CRON[2792]: pam_unix(cron:session): session closed for user 192.168.1.2
Apr 27 07:42:07 John CRON[2792]: pam_unix(cron:session): session opened for user 192.168.2.22 by (uid=0)
所需的输出将只是阵列中的IP,然后也是一个关于有多少IP的“计数”


我知道我可以用grep命令获得ip,但我想以后用它做更多的事情,而且它在一个数组中很重要。

您的两个主要问题是您使用了
declare-a
,但是要声明关联数组,您需要
declare-a
。然后,要迭代关联数组的键,需要在${!ArrayName[@]}中为foo使用
。为了安全起见,我还在变量中添加了一些引号:

#/bin/bash
searchString=“$1”
file=“$2”
countLines()
{
##关联数组需要-A
声明-ipCount
cnt=0
边读边做
((cnt+=1))
ipaddr=$(echo“$line”| grep-o-E'(25[0-5]| 2[0-4][0-9]|[0-9][0-9]?)\(25[0-5]| 2[0-4][0-9]|[01]|[0-9][0-9]。\(25[0-5]| 2[0-4][0-9]|[01]|[0-9]|[0-9]。。(25[0-5]1240-5]1240-9]1240]
((ipCount[“$ipaddr”]+=1))
完成
##迭代关联对象的键的步骤
##数组,您需要${!ArrayName[@]}
对于“${!ipCount[@]}”中的ip
做
printf“%-15s%s\n”“$ip”“${ipCount[$ip]}”
完成
echo“总计数=$cnt”
}
如果[$#-lt 2];然后
回显“缺少搜索字符串和文件”
其他的
grep“$searchString”“$file”| countLines
fi
这是上述示例文件的输出:

$ bash a.sh 27 a
192.168.2.22    1
192.168.1.2     2
total count=3

您使用的是什么版本的bash?
/bin/bash--version
的输出是什么?另外,这是一个非常荒谬的复杂正则表达式来获取IP。您的
$line
看起来像什么?为什么不(假设你在GNU系统上)
grep-oP'[0-9.]+'
?,我使用的是virtualbox ubuntu:/它上面写着-GNU bash,版本4.2.25。但是正则表达式不是问题所在,我想做的是使用一个函数将IP放入一个数组中。我是这个脚本的新手,所以非常感谢所有的帮助!t好的,请显示
$line
的内容,以便我们知道输出是什么样子的。您也有各种语法错误,但除非您显示输入和所需的输出,否则我无法真正提供帮助