Какой лучший способ получить только последнее совпадение регулярного выражения в файле с помощью grep?
Кроме того, можно ли начать поиск с конца файла, а не с начала, и остановиться при обнаружении первого совпадения?
Вы могли бы попробовать
grep pattern file | tail -1
или
tac file | grep pattern | head -1
или
tac file | grep -m1 pattern
Я всегда использую cat (но это немного длиннее): cat file | grep pattern | tail -1
Я бы винил своего преподавателя курса linux admin в колледже, который любит кошек :))))
- Вам не нужно сначала катать файл перед его установкой. grep pattern file | tail -1
и к тому же более эффективен.
Для тех, кто работает с огромными текстовыми файлами в Unix / Linux / Mac / Cygwin. Если вы используете Windows, ознакомьтесь с инструментами Linux в Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows.
Чтобы добиться хорошей производительности, можно следовать этому рабочему процессу:
zq
из упаковки.Цитата из его readme на github:
Создание индекса
zindex необходимо указать, какая часть каждой строки составляет индекс. Это можно сделать с помощью регулярного выражения, поля или пропуска каждой строки через внешнюю программу.
По умолчанию zindex создает индекс file.gz.zindex, когда его просят проиндексировать file.gz.
Пример:
создать индекс для строк, соответствующих числовому регулярному выражению. Группа захвата указывает часть, которая должна быть проиндексирована, а параметры показывают, что каждая строка имеет уникальный числовой индекс.
$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique
Пример: создайте индекс по второму полю файла CSV:
$ zindex file.gz --delimiter , --field 2
Пример:
создать индекс для поля JSON orderId.id в любом из элементов массива действий корневого каталога документа (требуется jq). Запрос jq создает массив всех идентификаторов orderId.ids, а затем объединяет их с пробелом, чтобы каждая отдельная строка, переданная по конвейеру jq, создавала одну строку вывода с несколькими совпадениями, разделенными пробелами (который является разделителем по умолчанию).
$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'"
Запрос индекса
Программа zq используется для запроса индекса. Дается имя сжатого файла и список запросов. Например:
$ zq file.gz 1023 4443 554
Также возможен вывод по номеру строки, поэтому для вывода строк 1 и 1000 из файла:
$ zq file.gz --line 1 1000