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

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

cat * | grep DATABASE

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

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

(standard input):$DATABASE_FUNCTION = dothis();

2 ответа

Решение

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

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

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

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

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

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

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