我已经疯了,但我需要从这样的行中提取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命令。
答案 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))。