Найти несколько шаблонов слов в файлах

Таким образом, оказывается, что второй вариант действительно прав. Мне просто пришлось перезапустить пару раз, прежде чем он начал работать. Странный. Используйте этот синтаксис:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: yes
    eno2:
        dhcp4: no
        dhcp6: no
        addresses: [10.10.0.11/24]
        gateway4: 10.10.0.4
        routes:
        - to: 192.168.1.0/24
          via: 10.10.0.4        
        - to: 192.168.10.0/24
          via: 10.10.0.4 
0
задан 27 March 2018 в 18:00

12 ответов

Есть несколько причин, которые не сработали бы:

вы опустили местозаполнитель {} для -exec, который вы пытаетесь выполнить -exec несколько команд grep с одним вызовом, который я подозреваю ваша логика ошибочна, поскольку операция по умолчанию для поиска является логической AND, тогда как вы, вероятно, хотите fax ИЛИ phone И not address

Я не полностью ее протестировал, но я думаю, что вы хотите что-то больше похоже на

find /filesdir/ -maxdepth 1 -name '*.txt' -exec grep -q 'fax\|phone' {} \; -exec grep -lv 'address' {} \;
1
ответ дан 22 May 2018 в 11:45
  • 1
    Я сожалею, что открыл его снова. Сейчас я хочу ограничить результаты до 10. Использование | головой в конце команды. Я получаю: «grep», прерванный сигналом 13 ». Вопрос в том, как избавиться от него. – Josef Klimuk 8 May 2018 в 12:31
  • 2
    вам нужно использовать опцию -L вместо -lv в grep -lv 'address' , так как вы получите ложноположительный результат для файла, содержащего phone address\nfax. Кроме того, OP хочет 'fax' AND 'phone' and does not contain 'address', когда вы заявляете «факс ИЛИ телефон И не адрес» , и смотрите либо fax, либо phone not address – αғsнιη 8 May 2018 в 15:06

Есть несколько причин, которые не сработали бы:

вы опустили местозаполнитель {} для -exec, который вы пытаетесь выполнить -exec несколько команд grep с одним вызовом, который я подозреваю ваша логика ошибочна, поскольку операция по умолчанию для поиска является логической AND, тогда как вы, вероятно, хотите fax ИЛИ phone И not address

Я не полностью ее протестировал, но я думаю, что вы хотите что-то больше похоже на

find /filesdir/ -maxdepth 1 -name '*.txt' -exec grep -q 'fax\|phone' {} \; -exec grep -lv 'address' {} \;
1
ответ дан 17 July 2018 в 18:00

Есть несколько причин, которые не сработали бы:

вы опустили местозаполнитель {} для -exec, который вы пытаетесь выполнить -exec несколько команд grep с одним вызовом, который я подозреваю ваша логика ошибочна, поскольку операция по умолчанию для поиска является логической AND, тогда как вы, вероятно, хотите fax ИЛИ phone И not address

Я не полностью ее протестировал, но я думаю, что вы хотите что-то больше похоже на

find /filesdir/ -maxdepth 1 -name '*.txt' -exec grep -q 'fax\|phone' {} \; -exec grep -lv 'address' {} \;
1
ответ дан 23 July 2018 в 18:51

git grep

Вы можете использовать git grep для нескольких комбинаций с использованием булевых выражений, например:

git grep --all-match --no-index -e "fax" --and -e "phone" --and --not -e "address"

Вы можете комбинировать разные шаблоны с булевыми выражениями, такими как [ f6], --or и --not.

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им. --no-index Поиск файлов в текущем каталоге, который не управляется Git. -l / --files-with-matches / --name-only Показывать только имена файлов. -e Следующий параметр - это шаблон. По умолчанию используется базовое регулярное выражение.

Другие параметры для рассмотрения:

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им.

-q / --quiet / --silent Не выводить согласованные строки; выйдите со статусом 0, когда есть совпадение.

--threads Число используемых рабочих потоков grep.

Чтобы изменить тип паттерна, вы также можете использовать -G / --basic-regexp (по умолчанию), -F / --fixed-strings, -E / --extended-regexp, -P / --perl-regexp, -f file и др.

grep

Проверить man git-grep для дальнейшего help

grep -L "address" $(grep -l "phone" $(grep -rl "fax" .))

Вот синтаксис grep, который использует цепочку подстановок команд:

Найти имена файлов, имеющие шаблон «fax» (grep -rl "fax" .). Фильтруйте найденные имена файлов, которые имеют шаблон «телефон» (grep -l "phone" $(cmd)). Отфильтруйте дальше, чтобы исключить файлы, не имеющие address (grep -L "address" $(cmd)).

Объяснение:

find

Если вы работаете с большими данными, рассмотрите вместо этого замену команд . 27]

find . -type f -name '*.txt' \
  -execdir bash -c 'grep -L "address" "$(grep -l "phone" "$(grep -l "fax" "{}")")"' ';' \
2>/dev/null

Вышеприведенный пример может плохо работать с файлами с пробелами, так что вот версия с find:

2
ответ дан 22 May 2018 в 11:45
  • 1
    Я сожалею, что открыл его снова. Сейчас я хочу ограничить результаты до 10. Использование | головой в конце команды. Я получаю: «grep», прерванный сигналом 13 ». Вопрос в том, как избавиться от него. – Josef Klimuk 8 May 2018 в 12:31
  • 2
    @JosefKlimuk Можете ли вы попробовать git grep, я думаю, что это лучший, быстрый инструмент, не нужно использовать несколько труб. Я добавил информацию о том, как использовать его без git repo. – kenorb 8 May 2018 в 12:51
  • 3
    Ваше решение find по-прежнему не работает для файлов, включая пробелы. Так же как ваше решение git grep не перечисляет файл, содержащий шаблоны в нескольких строках, таких как fax\nphone – αғsнιη 8 May 2018 в 15:13

Печать имен файлов и их содержимого в одной строке для каждого файла

Я думаю, что эта команда будет делать это:

find -maxdepth 1 -name "*.txt" -exec echo "{} :" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone'

Объяснение:

[d3 ] для каждого файла (который найден на find), эхо, имя файла печатает содержимое, распечатывает флаг «Окончание файла» (который должен отличаться от того, что может быть внутри файлов). Внимательно выберите этот флаг! Я использую EOF, вы можете нужно что-то другое. для всего вывода преобразуйте новые строки в пробелы, чтобы получить все на одной строке, конвертируйте флаги «Конец файла» в новые строки. Теперь содержимое каждого файла находится в одной отдельной строке, подходящей для grep. и, наконец, пропустите строки с «адрес» с оставшегося выхода, выберите строки с «факсом» с оставшегося выхода, выберите строки с «телефоном»

Печать только имен файлов

Предыдущая командная строка печатает имена файлов и содержимое файла (объединенные в одну строку), что хорошо для тестирования, но не для обработки тысяч файлов.

Следующая строка командной строки печатает только файл na тез. Он использует «:::» для разделения каждого имени файла из содержимого файла.

find -maxdepth 1 -name "*.txt" -exec echo "{} :::" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone' | sed 's/ :::.*//'
1
ответ дан 22 May 2018 в 11:45
  • 1
    Tnx. Будет ли он предоставлять телефон и факс? – Josef Klimuk 27 March 2018 в 18:59
  • 2
    @JosefKlimuk, попробуйте с несколькими реальными файлами :-) Я протестировал его с некоторыми тестовыми файлами, и он работает для меня. Текущая версия печатает содержимое файлов, которые вам могут не нравиться, но я работаю над версией, которая записывает только имена файлов (файлов, содержащих «телефон» и «факс», но не «адрес». – sudodus 27 March 2018 в 19:02
  • 3
    Запустил его. Работает. Tnx. – Josef Klimuk 27 March 2018 в 19:07
  • 4
    @JosefKlimuk, Добро пожаловать. Мне понравилось это делать :-) – sudodus 27 March 2018 в 19:10
  • 5
    Я сожалею, что открыл его снова. Сейчас я хочу ограничить результаты до 10. Использование | головой в конце команды. Я получаю: «grep», прерванный сигналом 13 ». Вопрос в том, как избавиться от него. – Josef Klimuk 8 May 2018 в 12:30

Чтобы найти файлы (совместимые с файлами, включая пробел / или новую строку), они не содержат шаблон address:

find -type f ! -exec grep -q 'address' {} \; -print 

и печатают только те, которые содержат шаблоны fax и [ f7] в любом порядке всего файла:

find -type f ! -exec grep -q 'address' {} \; \
               -exec grep -qP '(?s)(?=.*?fax)(?=.*?phone)' {} \; -print

Или POSIXly:

find -type f ! -exec grep -q 'address' {} \; \
               -exec grep -q 'fax' {} \; \
               -exec grep -q 'phone' {} \; -print

Или если в имени файлов нет \n ewline, тогда: [!d5 ]

grep -lP '(?s)(?=.*?fax)(?=.*?phone)' * |xargs -d'\n' grep -L address
(?=pattern): Положительный Lookahead: Положительная конструкция lookahead представляет собой пару круглых скобок, с открывающейся скобкой, за которой следует знак вопроса и знак равенства. (?s) Известная «точка-все», которая сообщает grep, чтобы точка . соответствовала символам \n. [F13] означает сопоставление любых символов ., которые появляются ноль или более раз *, в то время как они являются необязательными, а затем шаблон (fax или phone). [F18] делает все необязательным перед ним (означает нуль или одно время всего, что соответствует .*) будущее чтение:

Regex lookahead, lookbehind и атомные группы

0
ответ дан 22 May 2018 в 11:45

git grep

Вы можете использовать git grep для нескольких комбинаций с использованием булевых выражений, например:

git grep --all-match --no-index -e "fax" --and -e "phone" --and --not -e "address"

Вы можете комбинировать разные шаблоны с булевыми выражениями, такими как --and, --or и --not.

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им. --no-index Поиск файлов в текущем каталоге, который не управляется Git. -l / --files-with-matches / --name-only Показывать только имена файлов. -e Следующий параметр - это шаблон. По умолчанию используется базовое регулярное выражение.

Другие параметры для рассмотрения:

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им.

-q / --quiet / --silent Не выводить согласованные строки; выйдите со статусом 0, когда есть совпадение.

--threads Число используемых рабочих потоков grep.

Чтобы изменить тип паттерна, вы также можете использовать -G / --basic-regexp (по умолчанию), -F / --fixed-strings, -E / --extended-regexp, -P / --perl-regexp, -f file и др.

grep

Проверить man git-grep для дальнейшего help

grep -L "address" $(grep -l "phone" $(grep -rl "fax" .))

Вот синтаксис grep, который использует цепочку подстановок команд:

Найти имена файлов, имеющие шаблон «fax» (grep -rl "fax" .). Фильтруйте найденные имена файлов, которые имеют шаблон «телефон» (grep -l "phone" $(cmd)). Отфильтруйте дальше, чтобы исключить файлы, не имеющие address (grep -L "address" $(cmd)).

Объяснение:

find

Если вы работаете с большими данными, рассмотрите вместо этого замену команд .

find . -type f -name '*.txt' \ -execdir bash -c 'grep -L "address" "$(grep -l "phone" "$(grep -l "fax" "{}")")"' ';' \ 2>/dev/null

Вышеприведенный пример может плохо работать с файлами с пробелами, так что вот версия с find:

2
ответ дан 17 July 2018 в 18:00

Печать имен файлов и их содержимого в одной строке для каждого файла

Я думаю, что эта команда будет делать это:

find -maxdepth 1 -name "*.txt" -exec echo "{} :" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone'

Объяснение:

для каждого файла (который найден на find), эхо, имя файла печатает содержимое, распечатывает флаг «Окончание файла» (который должен отличаться от того, что может быть внутри файлов). Внимательно выберите этот флаг! Я использую EOF, вы можете нужно что-то другое. для всего вывода преобразуйте новые строки в пробелы, чтобы получить все на одной строке, конвертируйте флаги «Конец файла» в новые строки. Теперь содержимое каждого файла находится в одной отдельной строке, подходящей для grep. и, наконец, пропустите строки с «адрес» с оставшегося выхода, выберите строки с «факсом» с оставшегося выхода, выберите строки с «телефоном»

Печать только имен файлов

Предыдущая командная строка печатает имена файлов и содержимое файла (объединенные в одну строку), что хорошо для тестирования, но не для обработки тысяч файлов.

Следующая строка командной строки печатает только файл na тез. Он использует «:::» для разделения каждого имени файла из содержимого файла.

find -maxdepth 1 -name "*.txt" -exec echo "{} :::" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone' | sed 's/ :::.*//'
1
ответ дан 17 July 2018 в 18:00

Чтобы найти файлы (совместимые с файлами, включая пробел / или новую строку), они не содержат шаблон address:

find -type f ! -exec grep -q 'address' {} \; -print

и печатают только те, которые содержат шаблоны fax и phone в любом порядке всего файла:

find -type f ! -exec grep -q 'address' {} \; \ -exec grep -qP '(?s)(?=.*?fax)(?=.*?phone)' {} \; -print

Или POSIXly:

find -type f ! -exec grep -q 'address' {} \; \ -exec grep -q 'fax' {} \; \ -exec grep -q 'phone' {} \; -print

Или если в имени файлов нет \n ewline, тогда:

grep -lP '(?s)(?=.*?fax)(?=.*?phone)' * |xargs -d'\n' grep -L address (?=pattern): Положительный Lookahead: Положительная конструкция lookahead представляет собой пару круглых скобок, с открывающейся скобкой, за которой следует знак вопроса и знак равенства. (?s) Известная «точка-все», которая сообщает grep, чтобы точка . соответствовала символам \n. [F13] означает сопоставление любых символов ., которые появляются ноль или более раз *, в то время как они являются необязательными, а затем шаблон (fax или phone). [F18] делает все необязательным перед ним (означает нуль или одно время всего, что соответствует .*) будущее чтение:

Regex lookahead, lookbehind и атомные группы

1
ответ дан 17 July 2018 в 18:00

git grep

Вы можете использовать git grep для нескольких комбинаций с использованием булевых выражений, например:

git grep --all-match --no-index -e "fax" --and -e "phone" --and --not -e "address"

Вы можете комбинировать разные шаблоны с булевыми выражениями, такими как --and, --or и --not.

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им. --no-index Поиск файлов в текущем каталоге, который не управляется Git. -l / --files-with-matches / --name-only Показывать только имена файлов. -e Следующий параметр - это шаблон. По умолчанию используется базовое регулярное выражение.

Другие параметры для рассмотрения:

--all-match При предоставлении нескольких выражений шаблона этот флаг указан для ограничения соответствия файлам, у которых есть строки, соответствующие всем им.

-q / --quiet / --silent Не выводить согласованные строки; выйдите со статусом 0, когда есть совпадение.

--threads Число используемых рабочих потоков grep.

Чтобы изменить тип паттерна, вы также можете использовать -G / --basic-regexp (по умолчанию), -F / --fixed-strings, -E / --extended-regexp, -P / --perl-regexp, -f file и др.

grep

Проверить man git-grep для дальнейшего help

grep -L "address" $(grep -l "phone" $(grep -rl "fax" .))

Вот синтаксис grep, который использует цепочку подстановок команд:

Найти имена файлов, имеющие шаблон «fax» (grep -rl "fax" .). Фильтруйте найденные имена файлов, которые имеют шаблон «телефон» (grep -l "phone" $(cmd)). Отфильтруйте дальше, чтобы исключить файлы, не имеющие address (grep -L "address" $(cmd)).

Объяснение:

find

Если вы работаете с большими данными, рассмотрите вместо этого замену команд .

find . -type f -name '*.txt' \ -execdir bash -c 'grep -L "address" "$(grep -l "phone" "$(grep -l "fax" "{}")")"' ';' \ 2>/dev/null

Вышеприведенный пример может плохо работать с файлами с пробелами, так что вот версия с find:

2
ответ дан 23 July 2018 в 18:51
  • 1
    Я сожалею, что открыл его снова. Сейчас я хочу ограничить результаты до 10. Использование | головой в конце команды. Я получаю: «grep», прерванный сигналом 13 ». Вопрос в том, как избавиться от него. – Josef Klimuk 8 May 2018 в 12:31
  • 2
    @JosefKlimuk Можете ли вы попробовать git grep, я думаю, что это лучший, быстрый инструмент, не нужно использовать несколько труб. Я добавил информацию о том, как использовать его без git repo. – kenorb 8 May 2018 в 12:51
  • 3
    Ваше решение find по-прежнему не работает для файлов, включая пробелы. Так же как ваше решение git grep не перечисляет файл, содержащий шаблоны в нескольких строках, таких как fax\nphone – αғsнιη 8 May 2018 в 15:13

Печать имен файлов и их содержимого в одной строке для каждого файла

Я думаю, что эта команда будет делать это:

find -maxdepth 1 -name "*.txt" -exec echo "{} :" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone'

Объяснение:

для каждого файла (который найден на find), эхо, имя файла печатает содержимое, распечатывает флаг «Окончание файла» (который должен отличаться от того, что может быть внутри файлов). Внимательно выберите этот флаг! Я использую EOF, вы можете нужно что-то другое. для всего вывода преобразуйте новые строки в пробелы, чтобы получить все на одной строке, конвертируйте флаги «Конец файла» в новые строки. Теперь содержимое каждого файла находится в одной отдельной строке, подходящей для grep. и, наконец, пропустите строки с «адрес» с оставшегося выхода, выберите строки с «факсом» с оставшегося выхода, выберите строки с «телефоном»

Печать только имен файлов

Предыдущая командная строка печатает имена файлов и содержимое файла (объединенные в одну строку), что хорошо для тестирования, но не для обработки тысяч файлов.

Следующая строка командной строки печатает только файл na тез. Он использует «:::» для разделения каждого имени файла из содержимого файла.

find -maxdepth 1 -name "*.txt" -exec echo "{} :::" \; -exec cat {} \; -exec echo EOF \;| tr '\n' ' '|sed 's/EOF /\n/g'|grep -iv 'address'|grep -i 'fax'|grep -i 'phone' | sed 's/ :::.*//'
1
ответ дан 23 July 2018 в 18:51
  • 1
    Tnx. Будет ли он предоставлять телефон и факс? – Josef Klimuk 27 March 2018 в 18:59
  • 2
    @JosefKlimuk, попробуйте с несколькими реальными файлами :-) Я протестировал его с некоторыми тестовыми файлами, и он работает для меня. Текущая версия печатает содержимое файлов, которые вам могут не нравиться, но я работаю над версией, которая записывает только имена файлов (файлов, содержащих «телефон» и «факс», но не «адрес». – sudodus 27 March 2018 в 19:02
  • 3
    Запустил его. Работает. Tnx. – Josef Klimuk 27 March 2018 в 19:07
  • 4
    @JosefKlimuk, Добро пожаловать. Мне понравилось это делать :-) – sudodus 27 March 2018 в 19:10
  • 5
    Я сожалею, что открыл его снова. Сейчас я хочу ограничить результаты до 10. Использование | головой в конце команды. Я получаю: «grep», прерванный сигналом 13 ». Вопрос в том, как избавиться от него. – Josef Klimuk 8 May 2018 в 12:30

Чтобы найти файлы (совместимые с файлами, включая пробел / или новую строку), они не содержат шаблон address:

find -type f ! -exec grep -q 'address' {} \; -print

и печатают только те, которые содержат шаблоны fax и phone в любом порядке всего файла:

find -type f ! -exec grep -q 'address' {} \; \ -exec grep -qP '(?s)(?=.*?fax)(?=.*?phone)' {} \; -print

Или POSIXly:

find -type f ! -exec grep -q 'address' {} \; \ -exec grep -q 'fax' {} \; \ -exec grep -q 'phone' {} \; -print

Или если в имени файлов нет \n ewline, тогда:

grep -lP '(?s)(?=.*?fax)(?=.*?phone)' * |xargs -d'\n' grep -L address (?=pattern): Положительный Lookahead: Положительная конструкция lookahead представляет собой пару круглых скобок, с открывающейся скобкой, за которой следует знак вопроса и знак равенства. (?s) Известная «точка-все», которая сообщает grep, чтобы точка . соответствовала символам \n. [F13] означает сопоставление любых символов ., которые появляются ноль или более раз *, в то время как они являются необязательными, а затем шаблон (fax или phone). [F18] делает все необязательным перед ним (означает нуль или одно время всего, что соответствует .*) будущее чтение:

Regex lookahead, lookbehind и атомные группы

1
ответ дан 23 July 2018 в 18:51

Другие вопросы по тегам:

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