2013-09-05 4 views
-2

Из того, что я нашел на этом веб-сайте и в других онлайн-источниках, говорится, что он использует двойные кавычки вокруг переменной. Но это не работает для меня.Как использовать grep с использованием переменной в bash

Например:

Моя переменная $GTUNNELNATNETIP

[johnwayne:630 ~] GTUNNELNATNETIP=`cat iptables.out |awk '{print $NF}'|cut -d "/" -f1` 
[johnwayne:631 ~] echo $GTUNNELNATNETIP 
10.19.192.0 
[johnwayne:632 ~] 

и файл Я ищу в это iptables2.out

поиска без кавычек находит значение, но не без ошибок

[johnwayne:632 ~] grep $GTUNNELNATNETIP iptables2.out 
grep: : No such file or directory 
iptables2.out:-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:633 ~] 

Он не работает с d овальные или одинарные кавычки. Или любой другой формат, я попытался

[johnwayne:633 ~] grep "$GTUNNELNATNETIP" iptables2.out 
grep: Trailing backslash 
[johnwayne:634 ~] grep '$GTUNNELNATNETIP' iptables2.out 
[johnwayne:635 ~] grep `echo $GTUNNELNATNETIP` iptables2.out 
grep: : No such file or directory 
iptables2.out:-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:636 ~] /bin/grep $GTUNNELNATNETIP iptables2.out 
/bin/grep: : No such file or directory 
iptables2.out:-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:637 ~] 

Он работает, когда я прохожу фактическое значение без ошибки

[johnwayne:637 ~] grep 10.19.192.0 iptables2.out 
-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:638 ~] 

Так почему же произойдет, что ошибка Grep, когда файл и каталог существуют? И как передать переменную без ошибок. Я пытаюсь подсчитать, сколько строк возвращает grep, и получить точную команду iptables без отображения имени файла.

так:

[johnwayne:637 ~] /bin/grep 10.19.192.0 iptables2.out 
-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:638 ~] 

в противоположность этому:

[johnwayne:620 ~] grep $GTUNNELNATNETIP iptables2.out 
grep: : No such file or directory 
iptables2.out:-A POSTROUTING -s 10.19.192.0/22 -o eth1 -j SNAT --to-source 64.134.58.175 
[johnwayne:621 ~] 
+0

Не могли бы вы предоставить вывод '' echo '$ GTUNNELNATNETIP "' '? –

+0

Показать вывод 'echo '$ GTUNNELNATNETIP" | cat -vte'? – anubhava

ответ

3

Вы должны процитировать его

grep "$GTUNNELNATNETIP" iptables2.out 

Read more about quoting variables in bash
Это должно работать.

Я не могу воспроизвести вашу ошибку trailing backslash, но, скорее всего, у вас есть какой-то мусор в $GTUNNELNATNETIP переменных

+0

Но в вопросе говорится, что он попробовал и получил «grep: Trailing backslash» (понятия не имею, почему это может произойти). – user000001

2

Проблема заключается в том, что echo $GTUNNELNATNETIP без кавычек заставляет оболочку для удаления «незначительных» оболочки специальных символов. Используйте echo "$GTUNNELNATNETIP", и вы обнаружите, что он действительно имеет обратную косую черту и, возможно, другие проблемы.

(еще лучше, научиться использовать printf, set или env исследовать переменные.)

Присвоение uses cat uselessly и может использовать некоторые дополнительные рефакторинга в любом случае. Попробуй это?

GTUNNELNATNETIP=$(awk '{split(/\//,g,$NF); print g[1] }' iptables.out) 

... но это еще не пытается решить эту проблему, потому что мы не знаем точно, как несовершенно значение. Может быть, просто добавьте gsub(/\\/,"",g[1]); перед печатью?

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