кошка * | grep что-то ... в каком файле результат?

8

Если нужно было выполнить следующую команду

cat * | grep DATABASE

оболочка будет выплевывать все строки в * файлах, которые содержат слово DATABASEв них. Есть ли способ также выложить, из какого файла каждая строка отделена?

Я попытался использовать -Hопцию для grep, который согласно manговорит, print the filename for each matchно в моей оболочке он просто говорит

(standard input):$DATABASE_FUNCTION = dothis();
Джейк Уилсон
источник
хороший вопрос. Я все еще пытаюсь сломать кошку -> Привычка самому себе. :)
Sirex

Ответы:

22

Не используйте кошку для этого. Вместо этого используйте grep DATABASE *или grep -n DATABASE *(если вы хотите знать номера строк, а также имена файлов) напрямую.

Смотрите бесполезное использование кошки .

Чтобы прояснить это немного: на cat *самом деле объединяет все файлы по мере их подачи в grep через канал, поэтому grep не может узнать, какой контент принадлежит какому файлу, и даже не может точно знать, сканирует ли он файлы или вы просто печатать очень быстро. Это все один большой стандартный поток ввода, когда вы используете канал.

Наконец, -Hэто почти наверняка избыточно, поскольку grep печатает имя файла по умолчанию, когда для поиска требуется более одного файла. Это может быть полезно в случае, если вы хотите проанализировать вывод, так как есть некоторая вероятность, что *glob расширится до одного файла, и grep в этом случае пропустит имя файла.

Эдуардо Иванец
источник
6

Используйте grep -H DATABASE *(примечание: если в каталоге более одного файла, -Hэто необязательно).

Проблема, с которой вы столкнулись, заключается в том, что с помощью вашей команды cat *все файлы объединяются в один большой беспорядок, а затем |отправляются в стандартный ввод grep DATABASE. К тому времени, когда grep видит данные, информация о том, откуда они поступили, была потеряна. Решение состоит в том, чтобы grep выполнял работу по просмотру отдельных файлов, поэтому, когда он находит совпадение, он знает, из какого файла он получен.

Гордон Дэвиссон
источник