Если бы нужно было запустить следующую команду
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 выполнял работу по просмотру отдельных файлов, чтобы при нахождении совпадения он знал, из какого файла он пришел.