Найти файл со всеми заданными строками в Linux

Аналогично этому вопросу Как мне найти все файлы содержащие определенный текст в Linux?, но мне нужны все файлы, содержащие несколько заданных строк (эти строки не обязательно рядом друг с другом или в одной строке, просто в одном файле).

Мой вариант использования: я смотрю на пользовательский интерфейс и хочу изменить файл, который управляет этим конкретным экраном. Однако кодовая база огромна, и найти этот файл сложно. Все, что мне нужно сделать, это несколько жестко закодированных строк на этом экране, по которым я хотел бы выполнить поиск. Хотя строки довольно общие, такие как «Готово», «Закрыть», «Просмотреть подробности»... Выполнение поиска по любой из этих строк по отдельности, используя ответ из связанного вопроса выше, возвращает слишком много результатов, но я думаю выполнение поиска по всем из них вместе отфильтрует его достаточно, чтобы найти файл.


person user2802557    schedule 21.05.2020    source источник
comment
Может быть, использовать несколько вариантов -e для grep?   -  person Roadowl    schedule 21.05.2020
comment
Аналогичный вопрос здесь. Это то, что вы ищете?   -  person oguz ismail    schedule 21.05.2020
comment
@Roadowl Это соответствовало бы логическому ИЛИ для каждой строки и не возвращало бы файлы, содержащие все строки.   -  person Benjamin W.    schedule 21.05.2020
comment
@Benjamin W содержит несколько заданных строк, это не обязательно парафраз AND.   -  person Roadowl    schedule 21.05.2020
comment
если вы хотите получить файлы, содержащие более одной строки, используйте что-то вроде grep -rlZ 'Done' | xargs -0 grep -lZ 'Close' | xargs -0 grep -l 'View Details', где -r будет выполнять рекурсивный поиск (текущий каталог здесь, так как конкретный путь не передается).. продолжайте добавлять xargs -0 grep -lZ к любому количеству строк, которые вам нужны   -  person Sundeep    schedule 21.05.2020
comment
@Roadowl Я интерпретировал слишком много результатов, но я думаю, что выполняю поиск по всем из них вместе, так как содержит их все.   -  person Benjamin W.    schedule 21.05.2020
comment
@Sundeep, это работает, давая нужный мне результат, хотя и очень медленно, я ожидаю, что из-за того, что мне нужно выполнить несколько greps, если есть способ сделать это с помощью одного, я думаю, было бы намного быстрее   -  person user2802557    schedule 21.05.2020
comment
это файлы ASCII? если это так, использование LC_ALL=C grep .... будет намного быстрее... в противном случае я бы предложил ripgrep, поскольку он автоматически использует несколько ядер/потоков/и т. д. для повышения производительности, а также имеет другие оптимизации.   -  person Sundeep    schedule 21.05.2020
comment
использование одного grep может работать, если у вас есть PCRE (что, вероятно, так же, как и у вас в Linux).. но оно поставляется со сложным регулярным выражением и зависит от вашего ввода.. в любом случае, попробуйте grep -rlzP '(?s)(?=.*Done)(?=.*Close)(?=.*View Details)'   -  person Sundeep    schedule 21.05.2020
comment
Я считаю, что решение Sundeep является наиболее эффективным подходом. Тем не менее: сначала поставьте поисковый запрос, который, по вашему мнению, соответствует наименьшему количеству файлов; второе, третье и т. д. приложения grep не просматривают все ваши файлы, они просматривают только те файлы, о которых уже известно, что они содержат первое условие поиска (или все предыдущие, в общем случае ). Кроме того, если вы используете фиксированные строки, используйте флаг -F, чтобы выполнять поиск только фиксированных строк (намного быстрее). И, если вы хотите искать только целые слова ('Close' хорошо, 'Closest' не соответствует), добавьте также флаг -w. Расскажите нам, как это происходит.   -  person mathguy    schedule 22.05.2020