как сопоставить / data1 как слово с помощью grep - PullRequest
2 голосов
/ 28 декабря 2011

Я использую Solaris 5.10 и работаю на Bash Shell .У меня есть сценарий оболочки, в котором следующее утверждение не работает

ssh 172.18.16.55 "df -h" |grep -w /data1

Когда я заменяю / data1 на data1 (то есть удалено "/"),работает правильно.

У меня есть другое утверждение, подобное приведенному ниже, которое работает нормально.

ssh 172.18.16.55 "df -h" |grep -w /dev/dsk/c1t0d0s0

Насколько я понимаю, первое вхождение "/" (косая черта) не распознаетсясценарий оболочки.Я хочу знать, каково значение "/" в сценарии оболочки?ниже мои выводы.

root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep '/data1\>'
/dev/md/dsk/d50         84G    59G    24G    71%    /data1

root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep -w /data1

ничего не печатает.


root@P020XIDCNF # ssh 172.18.16.55 "df -h" |grep /data1
/dev/md/dsk/d50         84G    59G    24G    71%    /data1

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Вы уверены, что вывод, возвращаемый df -h, на самом деле содержит строку /data1?grep ничего не печатает, если строка не найдена.

РЕДАКТИРОВАТЬ Чтобы облегчить поиск ответа, его проблема заключалась в том, что grep не учел /data1слово.

2 голосов
/ 28 декабря 2011
Опция

grep -w указывает, что шаблон должен соответствовать «слову», то есть «границе слова» до и после него.Я думаю, что происходит то, что идея grep о границе слова не соответствует ожидаемой.

Вы можете использовать \< и \> для явного соответствия границ слова.

Вот несколько примеров работы в системе Solaris 9:

% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep -w /data1
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '\</data1\>'
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '/data1\>'  
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% 

Очевидно, что Solaris grep не считает границу между пробелом и символом / границей слова.

Я предлагаю запустить man grep и, возможно, следуя некоторым ссылкам «См. Также», чтобы увидеть, как это задокументировано.(Я пытался сделать это сам, но система Solaris, к которой у меня есть доступ, в настоящий момент испытывает проблемы.)

Если вы хотите использовать эту команду как часть достаточно переносимого сценария, вам нужно знать,что это область, в которой GNU grep ведет себя по-разному.В моей системе Linux с GNU grep я получаю следующее:

% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep -w /data1
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '\</data1\>'
% echo /dev/md/dsk/d50 84G 59G 25G 71% /data1 | grep '/data1\>'  
/dev/md/dsk/d50 84G 59G 25G 71% /data1
% 

Обратите внимание, что на ваш вопрос было бы легче ответить, если бы вы показали нам точную строку, которую вы ожидали получить.*

...