Понимание команды 'grep' показывает результаты, отличные от ожидаемых [закрыто]

service --status-all

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

0
31.07.2016, 19:21
2 ответа

«P *» что-то соответствует (или not ) из вашей оболочки до того, как grep увидит параметр. Если вы процитируете его, вы получите лучшие результаты, но имейте в виду, что grep соответствует регулярным выражениям, а не глобам.

Так что просто «П» подойдет. Поскольку это регулярное выражение, вам не нужна звездочка * , чтобы разрешить сопоставление символов, следующих за «P» (по умолчанию grep игнорирует их):

ls -p | grep -v / | grep "P"

или

ls -p | grep -v / | grep '^P'

В продолжение измененного вопроса, чтобы игнорировать регистр, используйте параметр -i команды grep, например,

ls -p | grep -v / | grep -i '^P'

Дополнительная литература:

3
28.01.2020, 02:15

Во второй команде вы grep P * . Это побудит оболочку выполнить подстановку имен файлов на P * , т.е. она расширит P * на все файлы, начинающиеся с буквы P .

Используйте set -x в вашей оболочке, чтобы увидеть, что выполняется (отключите трассировку с помощью set + x ). На самом деле у меня по умолчанию включена трассировка в моих собственных интерактивных сеансах оболочки, просто чтобы посмотреть, что я делаю .

Использование двойных кавычек P * не решит этой проблемы, поскольку регулярное выражение P * также соответствует таким именам файлов, как APPLE и ]файл.PP , а на самом деле hello_world.c и все другие имена файлов, а также P * также сопоставляют имена файлов с no P в них.

Как правило, вы не должны анализировать вывод ls , поэтому следующий способ будет лучшим способом получить список файлов (не каталогов), начинающихся с буквы P :

$ find . -type f -maxdepth 1 -name "P*"

Это найдет все обычные файлы ( -тип f ) в текущем каталоге (. ) с именами, начинающимися с P ( -название "P *" ). Параметр -maxdepth 1 ограничивает find только этим каталогом. В противном случае он также рекурсивно переместился бы в подкаталоги.

Что касается , найдите , что вы делаете с помощью grep -v / , т.е. удаляете каталоги из списка, а не выбираете обычные файлы:

$ find . ! -type d -maxdepth 1 -name "P*"

Также будут найдены нестандартные файлы, такие как сокеты и т. Д. В некоторых оболочках необходимо экранировать или заключать в кавычки ! , т.е. говоря

$ find . "!" -type d -maxdepth 1 -name "P*"

или

$ find . \! -type d -maxdepth 1 -name "P*"

Обратите внимание, что цитирование P * важно, чтобы ваша оболочка не расширяла его.

3
28.01.2020, 02:15

Теги

Похожие вопросы