выполнение нескольких greps в одной команде find

Менеджер пакетов по умолчанию в Red Hat Linux — yum, а не apt-get. Несмотря на то, что в одном из сообщений об ошибках, которые вы опубликовали, упоминается Debian/Ubuntu, я предполагаю, что вы используете систему Red Hat, как предполагает ваш вопрос. Вероятно, вы можете подтвердить свой дистрибутив Linux, используя одну из следующих команд:

cat /etc/*-release
lsb_release -a
cat /proc/version

Существует страница документации Plone для Подготовка к установке Plone с примечаниями для CentOS, которая по сути является бесплатным вариантом Red Hat. Эта страница предлагает следующую команду установки yum для зависимостей для Plone 5:

yum install gcc-c++ patch openssl-devel libjpeg-devel libxslt-devel readline-devel make which python-devel wv poppler-utils

Или для зависимостей Plone 4:

yum install gcc-c++ patch openssl-devel libjpeg-devel libxslt-devel readline-devel make which python-devel

Конечно, есть предостережения о том, используете ли вы системную версию Python по умолчанию, поэтому вы захотите проверить это. Вы также должны убедиться, что вы просматриваете правильную документацию для версии Plone, которую вы пытаетесь установить.

После установки зависимостей запустите установщик, как вы пытались сделать ранее, предполагая, что аргументы верны:

sudo ./install.sh --target=/home/admin/Plone --build-python zeo

6
28.08.2011, 02:18
3 ответа

Насколько я понимаю, вы хотите перечислить файлы, содержащие оба "ключевое слово1" и "ключевое слово2".Для этого вы можете использовать два теста -exec следующим образом:

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;

Это запустит второй grep условно - если первый вернул истину. Параметр -q предотвращает вывод из первого grep , так как он перечислит все файлы, содержащие только «ключевое слово1».

Поскольку опция -H выводит соответствующую строку вместе с именем файла, вы, вероятно, захотите использовать вместо этого -l . Итак,

find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;

Это даст результат, аналогичный тому, что предложил Калеб, но без необходимости в дополнительном -print .

8
29.04.2021, 00:58

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

find . -name "*.xml" -exec grep -qi "keyword1" {} \; -exec grep -qi "keyword2" {} \; -print

Обратите внимание, что я использовал параметр find -print для вывода имен файлов вместо того, чтобы делать это с помощью grep, и использовал -q параметр grep, чтобы перевести его в тихий режим, чтобы он просто выдавал код возврата, который может использоваться командой find, чтобы определить, был ли результат истинным или нет, а затем двигаться дальше. Если он достигает последнего шага (что означает, что оба файла совпадают), он распечатывает результат.

Однако это неэффективно, потому что grep фактически проверяет все файлы дважды. Если вы имели в виду свой вопрос буквально, это должно быть сделано, но если вы хотели найти файлы, содержащие ЛЮБУЮ из строк, вы можете использовать grep для поиска обоих шаблонов за один проход следующим образом:

find . -name "*.xml" -exec grep -qi -e "keyword1" -e "keyword2" {} \; -print

Изменить: Это неясно в вашем вопросе, что именно вы хотите, и два приведенных мной примера на самом деле делают разные вещи. Первая является операцией И и печатает только файлы, содержащие оба ключевых слова, а вторая операция ИЛИ, которая печатает имя файла, если оно содержит любую строку. Выбрать свой яд.

5
29.04.2021, 00:58

Или просто используйте egrep:

find. -name "* .xml" -exec egrep -iH "keyword1 | keyword2" {} \;

0
29.04.2021, 00:58

Теги

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