【问题标题】:Extracting ip address from auth.log line to a variable从 auth.log 行中提取 IP 地址到变量
【发布时间】:2011-06-10 01:51:55
【问题描述】:

我已经在这里发疯了,但是我需要从该行中提取 ip 地址:

“Jan 15 14:05:57 serrrver sshd[9784]:不允许来自 218.108.249.44 的用户 root,因为 AllowUsers 中没有列出”

我想,应该是这样的: 地址=$(expr match "$line" '\b[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3 }.[[:digit:]]{1,3}\b')

但实际上这些正则表达式不适用于 expr match 命令。我用其他命令尝试过这个匹配,它可以工作,唯一不工作的地方是 expr match 命令。

【问题讨论】:

  • 那么,使用“其他”命令?

标签: regex bash


【解决方案1】:

Grep 就是为这样的情况而设计的。

address=$(echo "Jan 15 14:05:57 seerrrver sshd[9784]: User root from 218.108.249.44 not allowed because not listed in AllowUsers" | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')

echo $address 返回 IP 地址。

假设您有一个完整的日志文件,一次处理所有行并将输出放入数组中是有意义的:

addressarray=( $(cat logfile | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |  sed -n -e ":a" -e "$ s/\n/ /gp;N;b a") )

您可以使用echo ${addressarray[@]} 查看数组的内容,或者通过将@ 替换为索引号(从0 开始)来访问其值。 echo ${addressarray[0]} 会给你第一个地址。

使用它来迭代数组值: for i in ${!addressarray[@]}; do echo ${addressarray[$i]}; done

【讨论】:

    【解决方案2】:

    由于 Bash 3.2 及更高版本具有正则表达式匹配,因此无需使用 expr

    string="Jan 15 14:05:57 seerrrver sshd[9784]: User root from 218.108.249.44 not allowed because not listed in AllowUsers"
    pattern='\<([0-9]{1,3}\.){3}[0-9]{1,3}\>'
    [[ $string =~ $pattern ]]
    address=${BASH_REMATCH[0]}
    

    expr 提供的正则表达式支持非常有限(它只支持基本的正则表达式 - BRE)而不是扩展的正则表达式 (ERE)。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多