Grep正则表达式被视为路径

时间:2016-09-05 12:27:24

标签: regex bash grep

我有一个脚本,我从txt文件读取字符串,然后将其分配给$ snmp_cred变量,然后尝试从字符串中删除ip地址,使用grep到另一个变量($ snmp_ip)

while read snmp_cred; do

echo appliance $ADDM_address and $snmp_cred 
snmp_ip=$(echo $snmp_cred | grep "/((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\d(?=@)/g")
echo IP for snmp community is $snmp_ip

done </tmp/input.txt

input.txt文件的内容是:

a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/10.72.168.33@public
a10networks/generic/1.3.6.1.4.1.22610.1.3.23_thunder_series1030s/172.17.48.24@public
a10networks/generic/1.3.6.1.4.1.22610.1.3.16_ax3200_12/10.251.1.101@public

正则表达式适用于在线正则表达式编辑器,但无法进入bash脚本。 Bash输出是:

++ echo $'a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/10.72.168.33@public\r'
++ grep '/((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\d(?=@)/g'
+ snmp_ip=
+ echo IP for snmp community is
IP for snmp community is

任何人都可以指出,我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您没有获得匹配的文本,因此您并不需要POSIX正则表达式不支持的前瞻。另请注意,POSIX正则表达式标准也不支持void uncaughtExceptionHandler(NSException *exception) { NSLog(@"CRASH: %@", exception); NSLog(@"Stack Trace: %@", [exception callStackSymbols]); // do your handling } 。此外,\d模式不应放在正则表达式分隔符中。

如果你仍然需要使用你的模式(比如,也可以获取匹配项),请使用grep选项:

-oP

online demo

答案 1 :(得分:0)

在此声明中:

snmp_ip=$($snmp_cred | grep "/((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\d(?=@)/g")

您只是在扩展变量,而不将其传递给grep 你需要将它作为参数传递给grep(以文件重定向的形式)或者将它发送给greps STDIN。

这对我有用

#!/bin/bash

while read snmp_cred; do
    #echo appliance $ADDM_address and $snmp_cred 
    snmp_ip=$(grep -E -o "((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)@" <<< $snmp_cred)
    echo IP for snmp community is $snmp_ip
done <input.txt

输出:

IP for snmp community is 10.72.168.33@
IP for snmp community is 172.17.48.24@
IP for snmp community is