it-swarm.com.ru

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

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

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

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

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

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

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

53
bits

Похоже, работа для sed:

sed -n '8,12p' yourfile

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

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

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

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

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

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

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

10
David

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

split -l 100000 database.sql database-

Это даст файлы как:

database-aaa
database-aab
database-aac
...
7
Dorian

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

6
Marc Pe-Pe

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

$ 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
thkala

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

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

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

1
Jose Antonio Escobar Garcia

Это старая ветка, но я был удивлен, что никто не упомянул 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

0
hbolingbroke