Как обрезать (вырезать) текстовые файлы на основе начальных и конечных номеров строк в Cygwin? - PullRequest
54 голосов
/ 16 апреля 2011

У меня есть несколько файлов журнала около 100 МБ каждыйЛично мне трудно работать с такими большими файлами.Я знаю, что строки журнала, которые мне интересны, имеют размер от 200 до 400 строк или около того.

Какой хороший способ извлечь из этих файлов соответствующие строки журнала, т.е. я просто хочу передать диапазон строкномера в другой файл.

Например, входные данные:

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276

Есть ли команда, которую я могу запустить в cygwin, чтобы cat выбрал только этот диапазон в этом файле?Я знаю, что если я могу каким-то образом отобразить этот диапазон в stdout, то я также могу направить к выходному файлу.

Примечание: добавление тега Linux для большей наглядности, но мне нужно решение, которое могло бы работатьв Cygwin.(Обычно команды linux работают в cygwin).

Ответы [ 7 ]

107 голосов
/ 16 апреля 2011

Звучит как работа для sed:

sed -n '8,12p' yourfile

... отправит строки с 8 по 12 yourfile на стандартный выход.

Если вы хотите добавить номер строки, вы можете сначала использовать cat -n:

cat -n yourfile | sed -n '8,12p'
10 голосов
/ 16 апреля 2011

Вы можете использовать wc -l, чтобы выяснить общее количество строк.

Затем вы можете объединить head и tail, чтобы получить желаемый диапазон.Давайте предположим, что журнал состоит из 40000 строк, вам нужны последние 1562 строки, затем из тех, что вы хотите первые 838. Итак:

tail -1562 MyHugeLogFile.log | head -838 | ....

Или, возможно, есть более простой способ использования sed или awk.

7 голосов
/ 24 августа 2012

Я видел эту ветку, когда пытался разбить файл на файлы с 100 000 строк.Лучшее решение, чем sed, для этого:

split -l 100000 database.sql database-

Это даст файлы типа:

database-aaa
database-aab
database-aac
...
6 голосов
/ 12 февраля 2015

А если вы просто хотите вырезать часть файла, скажем, от строки 26 до 142, и ввести его в новый файл: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt

4 голосов
/ 16 апреля 2011

Как насчет этого:

$ seq 1 100000 | tail -n +10000 | head -n 10
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009

Используется tail для вывода из 10 000-й строки и далее, а затем head для сохранения только 10 строк.

То же самое (почти) результат с sed:

$ seq 1 100000 | sed -n '10000,10010p'
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010

Преимущество этого варианта в том, что вы можете напрямую вводить диапазон строк.

1 голос
/ 05 февраля 2014

Если вас интересуют только последние X строк , вы можете использовать команду "tail" следующим образом.

$ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt

Это сохранит последние XXXXX строк вашего файла журнала в новый файл с именем «mycroppedfile.txt»

0 голосов
/ 08 сентября 2018

Это старая ветка, но я был удивлен, что никто не упомянул grep. Опция -A позволяет указать количество строк для печати после совпадения поиска, а опция -B включает строки перед совпадением. Следующая команда выведет 10 строк до и 10 строк после появления «моей строки поиска» в файле «mylogfile.log»:

grep -A 10 -B 10 "моя строка поиска" mylogfile.log

Если в большом файле несколько совпадений, вывод может быстро стать громоздким. Два полезных параметра: -n, который указывает grep включать номера строк, и --color, который выделяет сопоставленный текст в выводе.

Если требуется поискать больше файла, grep разрешает перечислять несколько файлов через пробел. Подстановочные знаки также могут быть использованы. Собираем все вместе:

grep -A 10 -B 10 -n - color "моя строка поиска" * .log someOtherFile.txt

...