Во-первых, необходимо защитить шаблон от расширения оболочкой. Самый легкий способ сделать, который должен поместить одинарные кавычки вокруг этого. Одинарные кавычки предотвращают расширение чего-либо между ними (включая обратные косые черты); единственная вещь, которую Вы не можете сделать затем, имеют одинарные кавычки в шаблоне.
grep -- 'foo*' *.txt
(также отметьте --
end-of-option-marker для остановки некоторых grep
реализации включая GNU grep
от обработки названного файла -foo-.txt
например (который был бы расширен оболочкой от *.txt
) быть взятым в качестве опции (даже при том, что это следует за аргументом неопции здесь)).
При необходимости в одинарной кавычке можно записать это как '\''
(закончите строковый литерал, литеральную кавычку, открытый строковый литерал).
grep -- 'foo*'\''bar' *.txt
Во-вторых, grep поддерживает, по крайней мере, v два синтаксиса для шаблонов. Старый, синтаксис по умолчанию (основные регулярные выражения) не поддерживает чередование (|
) оператор, хотя некоторые версии имеют его как расширение, но записанный с обратной косой чертой.
grep -- 'foo\|bar' *.txt
Портативный путь состоит в том, чтобы использовать более новый синтаксис, расширенные регулярные выражения. Необходимо передать -E
опция к grep
выбрать его (раньше, который был, покончили egrep
разделите команду ²),
grep -E -- 'foo|bar' *.txt
Другая возможность, когда Вы просто ищете любой из нескольких шаблонов (в противоположность созданию сложного шаблона с помощью разъединения) состоит в том, чтобы передать несколько шаблонов grep
. Можно сделать это путем предшествования каждому шаблону с -e
опция.
grep -e foo -e bar -- *.txt
Или помещенные шаблоны на нескольких строках:
grep -- 'foo
bar' *.txt
Или сохраните те шаблоны в файле, один на строку и работайте
grep -f that-file -- *.txt
Отметьте это если *.txt
расширяется до единственного файла, grep
не снабдит префиксом согласующие отрезки длинной линии его имя как он, делает, когда существует больше чем один файл. Работать вокруг этого, с некоторыми grep
реализации как GNU grep
, можно использовать -H
опция, или с любой реализацией, можно передать /dev/null
как дополнительный аргумент.
¹ некоторые grep
реализации поддерживают еще больше как perl-совместимые с -P
, или увеличенные с -X
, -K
для ksh подстановочных знаков...
², в то время как egrep
был удержан от использования POSIX и иногда больше не находится в некоторых системах, в некоторых других системах как Солярис, когда утилиты POSIX или GNU не были установлены, затем egrep
Ваша единственная опция как /bin/grep
поддержки ни один из -e
, -f
, -E
, \|
или многострочные шаблоны
Из Вашего комментария необходимо делать pgrep donothing.py
или pgrep -x donothing.py
.
При использовании pgrep -f
это ищет любую команду, которая имеет соответствующую строку в, он - имя и/или аргументы. Нет никакого симпатичного способа отфильтровать результаты. Решение состоит в том, чтобы соответствовать точно, что Вы после, так соответствуйте имени процесса.
pgrep
соответствиями по умолчанию просто имя процесса. По умолчанию это будет искать любой процесс, кто имя, содержит строку совпадения. С -x
это будет искать любой процесс, кто имя, точно соответствует строке.
pgrep
также достаточно умно для понимания сценариев. Если Вам назвали сценарий foo.sh
, это обнаружится в ps
как /bin/sh foo.sh
(или что-то подобное). В этом случае pgrep
вместо этого сравнит название сценария. Таким образом, можно сделать pgrep foo.sh
или pgrep -x foo.sh
.
Таким образом в Вашем случае, необходимо делать pgrep -x donothing.py
получить точное совпадение.
Править:
Я должен отметить, что это только работает, если сценарий был запущен как /path/to/donothing.py
. Если Вы запускаете его как python donothing.py
ничего не выйдет.
В этом случае необходимо использовать regex как pgrep -f '^python donothing.py'
.
EDIT2:
Проблема Вы встречаетесь с watch
заключает в кавычки. выполнение watch pgrep -f '^python donothing.py'
выполнения pgrep
без аргументов. -f '^python donothing.py'
передается как аргумент watch
, нет pgrep
как предназначено. Целая команда pgrep должна быть заключена в кавычки.
watch "pgrep -f '^python donothing.py'"
Как другое примечание. Если Вы собираетесь использовать это для другого материала, он мог бы более безопасный сделать
watch "pgrep -f '(^|\S+/)python donothing.py'"
Это поймает случай, где процесс обнаруживается как что-то как /usr/bin/python
вместо просто python
.
python donothing.py
, с которым не работает Ваше предложение. – Alex 03.04.2013, 19:42watch
(это работает какpgrep
автономный, хотя). – Alex 03.04.2013, 19:48pgrep
но нетwatch
затем Вы делаете что-то не так сwatch
. Можно ли обновить вопрос с полной командой, которую Вы пытаетесь выполнить. Всегда обеспечивайте специфические особенности :-) – Patrick 03.04.2013, 19:52