Насколько я знаю, в grep
нет способа сделать это.На самом деле, большинство утилита Unix упрямо построчный.Я не думаю, что есть способ напечатать, например, только часть строки в sed
.Даже в awk
, возможно, есть способ объединить что-то вместе, но я предполагаю, что это было бы неудовлетворительно.
Если в вашей системе есть GNU awk, попробуйте следующее:*
RS
устанавливает разделитель записей (обычно новую строку) в качестве шаблона.RT
- это текст, соответствующий RS
.FILENAME
говорит само за себя.exit
останавливает исполнение.Таким образом, после первой записи awk
напечатает текст шаблона и имя файла и завершит работу.Это не будет работать с более чем одним файлом, потому что выход здесь безусловный.
Если вам нужно запустить это для всех файлов в структуре каталогов, используйте find
и xargs
, и donне выходить, если вы что-то не нашли:
find . -type f -print0 | xargs -0 gawk 'BEGIN {RS="pattern"} {print RT, FILENAME; if (RT != "") exit}'
Это распечатывает имена файлов (с предшествующим пробелом) всего без шаблона, но печатает шаблон и имя файла, когда оно достигает первого шаблона,затем останавливается.
Конечно, вы должны быть немного осторожны с этой командой: поскольку разделитель записей может вообще отсутствовать, gawk
может вылить все содержимое файла в его буфер, иможет не хватить памяти.(Когда я проверил это на моей системе, я получил ошибку в 490 МБ.)