从auth.log行将IP地址提取到变量

时间:2011-01-16 18:16:01

标签: regex bash

我已经疯了,但我需要从这样的行中提取ip地址:

“1月15日14:05:57 seerrrver sshd [9784]:用户root来自218.108.249.44不允许,因为未在AllowUsers中列出”

我认为,它应该是这样的: address = $(expr匹配“$ line”'\ b [[:digit:]] {1,3}。[[:digit:]] {1,3}。[[:digit:]] {1,3 } [[:数字:]]。{1,3} \ b')的

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

由于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))。