Відповіді:
Ви можете спробувати
grep pattern file | tail -1
або
tac file | grep pattern | head -1
або
tac file | grep -m1 pattern
grep -n
) у фактичному файлі, я думаю, що tac
цього треба було уникнути, якщо тільки я не хотів зробити якесь віднімання wc -l
. Інакше tac
з grep -m1
має багато сенсу.
grep
перестане працювати після першого матчу. без -m 1
, grep
спочатку знайде всі відповідні шаблони у файлі , потім head
покаже лише перший - набагато менш ефективний. Деннісе, будь ласка, розглядайте питання про це окремою відповіддю!
Для тих, хто працює з величезними текстовими файлами в Unix / Linux / Mac / Cygwin. Якщо ви використовуєте Windows, ознайомтесь із інструментами Linux у Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows .
Можна дотримуватися цього робочого процесу, щоб мати хороші показники:
zq
пакету.Цитата з її програми github readme:
Створення індексу
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
Я завжди використовую кота (але це робить його трохи довшим): cat file | grep pattern | tail -1
Я б звинувачував мого викладача курсу linux в коледжі, який любить котів :))))
- Вам не доведеться спочатку копіювати файл перед тим, як отримати його. grep pattern file | tail -1
і є також більш ефективним.
cat
файл і передавати його grep
. Ви можете grep
шукати файл безпосередньо через grep pattern file
(а потім використовувати tail
для повернення останнього результату), як у відповіді Cakemox.
tac file | grep -m 1 pattern