Как обрезать (вырезать) текстовые файлы на основе начальных и конечных номеров строк в cygwin?

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

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

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

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

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

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

Ответ 1

Звучит как задание для sed:

sed -n '8,12p' yourfile

... отправит строки с 8 по 12 из yourfile в стандартную версию.

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

cat -n yourfile | sed -n '8,12p'

Ответ 2

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

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

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

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

Ответ 3

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

$ 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

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

Ответ 4

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

split -l 100000 database.sql database-

Он предоставит файлы вроде:

database-aaa
database-aab
database-aac
...

Ответ 5

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

Ответ 6

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

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

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