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

<p>у меня есть несколько файлов журнала около 100 мб каждый. лично мне трудно работать с такими большими файлами. я знаю, что строки журнала, которые мне интересны, составляют от 200 до 400 строк или около того.</p><p>что может быть хорошим способом для извлечения соответствующих строк журнала из этих файлов, то есть я просто хочу передать диапазон номеров строк в другой файл.</p><p>например, входные данные:</p><pre><code>filename: myhugelogfile.log starting line number: 38438 ending line number: 39276 </code></pre><p>есть ли команда, которую я могу запустить в cygwin, чтобы <code>cat</code> только этот диапазон в этом файле? я знаю, что если я могу каким-то образом отобразить этот диапазон в stdout, то я также могу передать в выходной файл.</p><p><em> примечание: добавление тега <code>linux</code> для большей наглядности, но мне нужно решение, которое может работать в cygwin. (обычно команды linux работают в cygwin). </em></p>

<p>похоже, работа для <code>sed</code>:</p><pre><code>sed -n '8,12p' yourfile </code></pre><p>... отправит строки с 8 по 12 из <code>yourfile</code> в стандартный вывод.</p><p>если вы хотите добавить номер строки, вы можете сначала использовать <code>cat -n</code>:</p><pre><code>cat -n yourfile | sed -n '8,12p' </code></pre>

<p>вы можете использовать <code>wc -l</code>, чтобы выяснить общее количество строк.</p><p>затем вы можете объединить <code>head</code> и <code>tail</code>, чтобы получить желаемый диапазон. предположим, что журнал состоит из 40000 строк, вам нужны последние 1562 строки, затем из тех, что вы хотите первые 838. итак:</p><pre><code>tail -1562 myhugelogfile.log | head -838 | .... </code></pre><p>или, возможно, есть более простой способ использования <code>sed</code> или <code>awk</code>.</p>

<p>я видел эту тему, когда пытался разбить файл на файлы по 100 000 строк. лучшее решение, чем sed для этого:</p><pre><code>split -l 100000 database.sql database- </code></pre><p>это даст файлы как:</p><pre><code>database-aaa database-aab database-aac ... </code></pre>

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

<p>как насчет этого:</p><pre><code>$ 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 </code></pre><p>это имеет то преимущество, что позволяет вам вводить линейный диапазон напрямую.</p>

<p>если вас интересуют только<strong> последние x строк </strong>, вы можете использовать команду "tail" следующим образом.</p><pre><code>$ tail -n xxxxx yourlogfile.log >> mycroppedfile.txt </code></pre><p>это сохранит последние xxxxx строк вашего файла журнала в новый файл с именем «mycroppedfile.txt»</p>

<p>это старая ветка, но я был удивлен, что никто не упомянул grep. опция -a позволяет указать количество строк для печати после совпадения поиска, а опция -b включает строки перед совпадением. следующая команда выведет 10 строк до и 10 строк после появления «моей строки поиска» в файле «mylogfile.log»:</p><p>grep -a 10 -b 10 "моя строка поиска" mylogfile.log</p><p>если в большом файле несколько совпадений, вывод может быстро стать громоздким. два полезных параметра: -n, который указывает grep включать номера строк, и --color, который выделяет соответствующий текст в выводе.</p><p>если есть больше, чем файл для поиска, grep позволяет перечислять несколько файлов через пробел. подстановочные знаки также могут быть использованы. собираем все вместе:</p><p>grep -a 10 -b 10 -n --color "моя строка поиска" * .log someotherfile.txt</p>