2016-09-05 2 views
-1

У меня есть сценарий, где я читаю строки из txt-файла, а затем назначаю его переменной $ snmp_cred, а затем пытаюсь удалить ip-адрес из строк, используя grep, в другую переменную ($ snmp_ip)Grep regex, обработанный как путь

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([email protected])/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/[email protected] 
a10networks/generic/1.3.6.1.4.1.22610.1.3.23_thunder_series1030s/[email protected] 
a10networks/generic/1.3.6.1.4.1.22610.1.3.16_ax3200_12/10.251[email protected] 

регулярное выражение работает в онлайн-редакторе регулярных выражений, но терпит неудачу в Баш скрипт. Выходной сигнал башки:

++ echo $'a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/[email protected]\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([email protected])/g' 
+ snmp_ip= 
+ echo IP for snmp community is 
IP for snmp community is 

Может ли кто-нибудь указать, что я делаю неправильно?

+0

Во-первых, вы должны попытаться повторить '$ snmp_cred' перед вами трубы в' grep': 'snmp_ip = $ (эхо $ snmp_cred | grep' ... – SLePort

+0

Хорошо, обновил сообщение с эхом и новым выходом. –

+0

Может быть, вам нужно 'grep -P'? Думаю, вам также не нужно' /.../ g', удалить косые черты и ' g' в конце или просто '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]?) [0-9] @ "'. используется '\ d' tha t не поддерживается регулярным выражением POSIX. –

ответ

1

Поскольку вы не получаете только согласованные тексты, вам не нужен внешний вид, который не поддерживает регулярное выражение POSIX. Также обратите внимание, что \d также не поддерживается стандартом regex стандарта POSIX. Кроме того, шаблон grep не должен размещаться внутри разделителей регулярных выражений.

Если вам все еще нужно использовать шаблон (например, чтобы также захватить спички), передать использование -oP вариант:

grep -oP "((25[0-5]|2[0-4]\d|[01]?[1-9]\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?[1-9]\d?)\d([email protected])" 

И online demo

+0

Во-первых это дает ошибку: прибор 172.22.90.240 и a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/[email protected] ++ 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]) [ 0-9] @ ' grep: Недопустимый символ сортировки + snmp_ip = –

+0

Во-вторых, он не обрезает IP-адрес. Только целая строка: appliance 172.22.90.240 и a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/[email protected] ++ echo $ 'a10networks/generic/1.3.6.1.4.1.22610.1.3.27 _thunder_series4430s/[email protected] \ r ' ++ grep -P' ((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_ip = $' a10networks/generic/1.3.6.1.4.1.22610.1.3.27_thunder_series4430s/[email protected] \ r ' –

+0

Обратите внимание, что мне нужно \ d (? = @) (Или любое эквивалент), чтобы найти совпадения с @ после, но не включать его в соответствие регулярному выражению. –

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([email protected])/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 [email protected] 
IP for snmp community is [email protected] 
IP for snmp community is 
+0

Из этого вывода мне нужно только последнее (10.72.168.33) Есть ли способ найти совпадения с @ после, но не включать его в соответствие регулярному выражению (\ d (? = @) (Или любой эквивалент)? –

+0

@VasiliyVegas oh ok, я обновил свой ответ, но по какой-то причине последний IP-адрес не подходит. –

+0

ввод кажется корректным, два оператора в цикле while могут быть заменены на 'sed -E 's | . */(. *) @. * | IP для сообщества snmp - \ 1 | '<<< "$ snmp_cred" ' – Sundeep

Смежные вопросы