Если нужно было выполнить следующую команду
cat * | grep DATABASE
оболочка будет выплевывать все строки в * файлах, которые содержат слово DATABASE
в них. Есть ли способ также выложить, из какого файла каждая строка отделена?
Я попытался использовать -H
опцию для grep, который согласно man
говорит, print the filename for each match
но в моей оболочке он просто говорит
(standard input):$DATABASE_FUNCTION = dothis();
Ответы:
Не используйте кошку для этого. Вместо этого используйте
grep DATABASE *
илиgrep -n DATABASE *
(если вы хотите знать номера строк, а также имена файлов) напрямую.Смотрите бесполезное использование кошки .
Чтобы прояснить это немного: на
cat *
самом деле объединяет все файлы по мере их подачи в grep через канал, поэтому grep не может узнать, какой контент принадлежит какому файлу, и даже не может точно знать, сканирует ли он файлы или вы просто печатать очень быстро. Это все один большой стандартный поток ввода, когда вы используете канал.Наконец,
-H
это почти наверняка избыточно, поскольку grep печатает имя файла по умолчанию, когда для поиска требуется более одного файла. Это может быть полезно в случае, если вы хотите проанализировать вывод, так как есть некоторая вероятность, что*
glob расширится до одного файла, и grep в этом случае пропустит имя файла.источник
Используйте
grep -H DATABASE *
(примечание: если в каталоге более одного файла,-H
это необязательно).Проблема, с которой вы столкнулись, заключается в том, что с помощью вашей команды
cat *
все файлы объединяются в один большой беспорядок, а затем|
отправляются в стандартный вводgrep DATABASE
. К тому времени, когда grep видит данные, информация о том, откуда они поступили, была потеряна. Решение состоит в том, чтобы grep выполнял работу по просмотру отдельных файлов, поэтому, когда он находит совпадение, он знает, из какого файла он получен.источник