Как использовать grep для нахождения всех файлов, которые содержат один шаблон, но не имеют секунды?

Из документации API Java:

класс Exception и его подклассы являются формой Throwable, который указывает на условия, которые разумное приложение могло бы хотеть поймать.

Error подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать.

Ошибки обычно являются низким уровнем (например, повышенные виртуальной машиной) и не должны быть зафиксированы приложением, так как разумное продолжение не могло бы быть возможным.

5
задан DVK 14 September 2009 в 15:41
поделиться

5 ответов

grep -rl "override.*commitProperties" . | xargs grep -L "super.commitProperties"

-l печатает файлы с совпадениями

-L печатает файлы без совпадений

10
ответ дан 18 December 2019 в 08:29
поделиться

Попробуйте

find . -print0 | xargs -0 grep -l "override.*commitProperties" \
| tr '\012' '\000' | xargs -0 grep -L super.commitProperties

Команда tr преобразует символы новой строки в ascii null, так что вы можете использовать -0 во втором xargs, избегая всех проблемы с пробелами в именах файлов и т. д.

Результат теста:

/tmp/test>more 1 2 3 | cat
::::::::::::::
1
::::::::::::::
override.*commitProperties
super.commitProperties
::::::::::::::
2
::::::::::::::
override.*commitProperties
::::::::::::::
3
::::::::::::::
hello world
/tmp/test>find . -print0 | xargs -0 grep -l "override.*commitProperties" | tr '\012' '\000' | xargs -0 grep -L super.commitProperties
./2
/tmp/test>

Как заметил Дуглас, find + xargs можно заменить на grep -r .

4
ответ дан 18 December 2019 в 08:29
поделиться

Используйте комбинацию 2 greps и comm, как показано ниже (шаблоны A и B). Обратите внимание, что конвейерный grep не будет работать, так как шаблоны могут быть в разных строках.

$ cat a
A
$ cat b
B
$ cat ab
A
B

$ grep -l A * > A.only
$ grep -l B * > B.only  

$ comm -23 A.only B.only 
a

ПРИМЕЧАНИЕ: команда comm выводит строки, общие или уникальные для двух файлов. «-23» печатает строки, уникальные для первого файла, таким образом подавляя имена файлов во втором файле.

2
ответ дан 18 December 2019 в 08:29
поделиться

Мое решение похоже на решение Дугласа Лидера, за исключением того, что я не использую xargs:

grep -l 'override.*commitProperties' $(grep -L super.commitProperties *.txt)

Команда grep -L выводит список файлы, которые НЕ содержат шаблон super.commitProperties , команда grep -l ищет шаблон * override. commitProperties из этого списка.

В целом , это другой способ снять шкуру с кошки.

2
ответ дан 18 December 2019 в 08:29
поделиться

ack -l --make "override. * CommitProperties" | xargs ack -L "super.commitProperties"

Я использовал этот поток и пытался выполнить рекурсивный поиск. Это заняло 25 минут +, поэтому вместо этого мы узнали о ack . Сделал это за 5 минут.

Удобный инструмент ack .

1
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

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