Назад | Перейти на главную страницу

Получение последнего совпадения в файле с помощью grep

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

Чтобы добиться хорошей производительности, можно следовать этому рабочему процессу:

  1. сжать с помощью gzip
  2. используйте zindex (на github: https://github.com/mattgodbolt/zindex) для индексации файла с соответствующим ключом
  3. запросить индексированный файл с помощью 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