Подстановочные знаки в Linux ведут себя некорректно - PullRequest
0 голосов
/ 26 сентября 2011

Я буду запускать список процессов, которые будут иметь следующие соглашения об именах:

a_feed
b_feed
c_feed
...

Я написал скрипт оболочки bash, который позволит мне отфильтровать процессы с этими шаблонами именования.Пожалуйста, посмотрите на одну строку в моем скрипте ниже:

ps -ef | grep -i *_feed | grep -v grep | awk '{print $2, " ", $8, " ", $10}'

По какой-то причине grep -i *_feed не может найти какой-либо процесс, который соответствует шаблону *_feed.

У кого-нибудь есть идеи, почему?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 26 сентября 2011

регулярное выражение пользователя grep, в котором * означает matches 0 or more times, а не any character.Вы должны заменить его на grep -i .*_feed

1 голос
/ 26 сентября 2011

* нужно что-то перед этим.

Также, если у вас есть файл с шаблоном *_feed в вашем рабочем каталоге, bash выполнит расширение с подстановочными знаками.

Использование:

grep -i '.*_feed'
0 голосов
/ 26 сентября 2011

Я обычно сохраняю вывод списка процессов в оболочке переменной, а затем найдите соответствующие строки в качестве новой команды. Это позволяет избежать необходимости grep -v удалить запущенную команду grep.

Я также сопоставляю строки внутри awk, так что grep вообще не требуется. Я думаю, что это легче читать и понимать:

p="$(ps -ef)"
echo "$p" | awk '/_feed/ {print $2, " ", $8, " ", $10}'
0 голосов
/ 26 сентября 2011

со страницы руководства grep:

-G, --basic-regexp Интерпретировать PATTERN как основное регулярное выражение (BRE, см. Ниже).Это значение по умолчанию.

, поэтому по умолчанию шаблон будет регулярным выражением.в вашем примере вы можете использовать grep -i ".*_feed"

...