grep结果到数组

时间:2014-05-22 14:26:32

标签: arrays shell grep

我想使用此函数计算给定文件中的IP数量,IP应该进入一个数组,以便我以后可以使用它们,但我得到'declare:not found'和'cnt + = 1:not发现',这是为什么?

#!/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,但是我想稍后用它做更多的事情,重要的是它在一个数组中。

1 个答案:

答案 0 :(得分:1)

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

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

countLines()
{
    ## You need -A for associative arrays
    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

    ## To iterate over the keys of an associative
    ## array, you need ${!ArrayName[@]}
    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

这是您的示例文件上面的输出:

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