Linux обрезать файл по размеру

Как обрезать файл по строкам?

У меня есть большое количество файлов, некоторые из которых очень длинные. Я хотел бы обрезать их до определенного размера, если они больше, удалив конец файла. Но я хочу только удалить целые строки. Как я могу это сделать? Это похоже на то, что будет обрабатываться инструментарием Linux, но я не знаю правильной команды.

Например, скажем, у меня есть файл размером 120000 байт с 300-байтовыми строками, и я пытаюсь обрезать его до 10000 байт. Первые 33 строки должны остаться (9900 байт), а остальные должны быть обрезаны. Я не хочу точно вырезать 10 000 байт, так как это оставит частичную строку.

Конечно, файлы имеют разную длину, а строки имеют разную длину.

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

sed / wc Сложность можно избежать в предыдущих ответах , если awk используется. Используя пример, предоставленный из OP (показаны полные строки до 10000 байт):

Также показывает полную строку, содержащую 10000-й байт, если этот байт не находится в конце строки:

Ответ выше предполагает:

  1. Текстовый файл имеет терминатор строки Unix ( \n ). Для текстовых файлов Dos / Windows ( \r\n ) измените length() + 1 на length() + 2
  2. Текстовый файл содержит только однобайтовый символ. Если есть многобайтовые символы (например, в среде Unicode), установите в среде LC_CTYPE=C принудительную интерпретацию на уровне байтов.

sed Подход хорошо, но в цикле по всем линиям не является. Если вы знаете, сколько строк вы хотите сохранить (для примера, я использую здесь 99), вы можете сделать это следующим образом:

Пояснение: sed это процессор регулярных выражений. С указанным параметром -i он обрабатывает файл напрямую («inline»), а не просто читает его и записывает результаты в стандартный вывод. 100,$ просто означает «от строки 100 до конца файла» — и сопровождается командой d , которую вы, вероятно, догадались правильно, чтобы заменить «удалить». Короче говоря, команда означает: «Удалить все строки из строки 100 до конца файла из myfile.txt». 100 — это первая строка, которую нужно удалить, так как вы хотите сохранить 99 строк.

Изменить: Если, с другой стороны, есть файлы журналов, где вы хотите сохранить, например, последние 100 строк:

Что здесь происходит:

  • [ $(wc -l myfile.txt) -gt 100 ] : делать следующее, только если файл содержит более 100 строк
  • $((100 — $(wc -l myfile.txt|awk ‘‘))) : вычислить количество удаляемых строк (т.е. сохранить все строки файла, кроме (последних) 100)
  • 1, $((..)) d : удалить все строки от первой до расчетной

РЕДАКТИРОВАТЬ: так как вопрос был только что отредактирован, чтобы дать больше деталей, я включу эту дополнительную информацию вместе с моим ответом. Добавлены факты:

  • конкретный размер должен оставаться в файле (10 000 байт)
  • каждая строка имеет определенный размер в байтах (300 байтов в примере)

Из этих данных можно рассчитать количество строк, которые останутся как «/», что в примере будет означать 33 строки. Термин оболочки для вычисления: $((size_to_remain / linesize)) (по крайней мере в Linux, использующем Bash, результат — целое число). Настроенная команда теперь будет выглядеть так:

Поскольку размеры известны заранее, больше нет необходимости в вычислениях, встроенных в sed команду. Но для большей гибкости внутри некоторого сценария оболочки можно использовать переменные.

Для условной обработки, основанной на размере файла, можно использовать следующую «тестовую» конструкцию:

что означает: «если размер $file превышает 100 КБ, делайте . » ( ls -lk перечисляет размер файла в КБ в позиции 5, следовательно awk , используется для извлечения именно этого).

Источник

Команда Cut в Linux с примерами

Linux Cut Command with Examples

В этом руководстве мы покажем вам, как использовать cut команду, на практических примерах и подробных объяснениях наиболее распространенных опций.

В системах Linux и Unix доступно множество утилит, позволяющих обрабатывать и фильтровать текстовые файлы. cut утилита командной строки, которая позволяет вырезать части строк из указанных файлов или данных по конвейеру и выводить результат в стандартный вывод. Его можно использовать для вырезания частей строки по разделителю, позиции байта и символу.

Как использовать cut команду

Синтаксис cut команды следующий:

Параметры, указывающие cut , использовать ли разделитель, позицию байта или символ при вырезании выделенных частей, выглядят следующим образом:

  • -f ( —fields=LIST ) — Выберите, указав поле, набор полей или диапазон полей. Это наиболее часто используемый вариант.
  • -b ( —bytes=LIST ) — Выберите, указав байт, набор байтов или диапазон байтов.
  • -c ( —characters=LIST ) — Выберите, указав символ, набор символов или диапазон символов.

Вы можете использовать один и только один из вариантов, перечисленных выше.

  • -d ( —delimiter ) — Укажите разделитель, который будет использоваться вместо разделителя «TAB» по умолчанию.
  • —complement — дополнить выбор. При использовании этого параметра cut отображаются все байты, символы или поля, кроме выбранного.
  • -s ( —only-delimited ) — по умолчанию cut печатает строки, которые не содержат символов-разделителей. Когда эта опция используется, cut не печатать строки, не содержащие разделителей.
  • —output-delimiter — По умолчанию cut используется входной разделитель в качестве выходного разделителя. Эта опция позволяет вам указать другую строку выходного разделителя.

Команда cut может принимать ноль или более входных имен FILE. Если не FILE указано, или когда FILE есть — , cut будет читать со стандартного ввода.

LIST Аргумент , переданный -f , -b и -c варианты могут быть целым числом, несколько целых чисел , разделенных запятыми, диапазон целых чисел или нескольких диапазонов целочисленных разделенных запятыми. Каждый диапазон может быть одним из следующих:

  • N N-е поле, байт или символ, начиная с 1.
  • N- от N-го поля, байта или символа до конца строки.
  • N-M от N-го до M-го поля, байта или символа.
  • -M от первого до M-го поля, байта или символа.

Как вырезать по полю

Чтобы указать поля, которые должны быть вырезаны, вызовите команду с -f опцией. Если не указан, по умолчанию используется разделитель «TAB».

В приведенных ниже примерах мы будем использовать следующий файл. Поля разделены вкладками.

Например, для отображения 1-го и 3-го полей вы должны использовать:

Или, если вы хотите отобразить с 1-го по 4-е поле:

Как резать на основе разделителя

Чтобы вырезать на основе разделителя, вызовите команду с -d параметром, а затем разделитель, который вы хотите использовать.

Например, чтобы отобразить 1-е и 3-е поля, используя «:» в качестве разделителя, введите:

Вы можете использовать любой отдельный символ в качестве разделителя. В следующем примере мы используем символ пробела в качестве разделителя и печатаем 2-е поле:

Как дополнить выбор

Для дополнения списка полей выбора используйте —complement опцию. Это напечатает только те поля, которые не выбраны с -f опцией.

Следующая команда напечатает все поля кроме 1-го и 3-го:

Как указать выходной разделитель

Чтобы указать выходной разделитель, используйте —output-delimiter опцию. Например, чтобы установить для _ вас выходной разделитель , используйте:

Как вырезать из байтов и символов

Прежде чем идти дальше, давайте сделаем различие между байтами и символами.

Один байт составляет 8 битов и может представлять 256 различных значений. Когда был установлен стандарт ASCII, в нем были учтены все буквы, цифры и символы, необходимые для работы с английским языком. Таблица символов ASCII имеет 128 символов, и каждый символ представлен одним байтом. Когда компьютеры стали доступны во всем мире, технологические компании начали вводить новые кодировки символов для разных языков. Для языков, содержащих более 256 символов, простое сопоставление 1 к 1 было невозможно. Это приводит к различным проблемам, таким как совместное использование документов или просмотр веб-сайтов, и был необходим новый стандарт Unicode, который может работать с большинством мировых систем письма. UTF-8 был создан для решения этих проблем. В UTF-8 не все символы представлены 1 байтом. Символы могут быть представлены от 1 байта до 4 байтов.

Опция -b ( —bytes ) указывает команде вырезать секции из каждой строки, заданной заданными позициями байтов.

В следующих примерах мы используем ü символ, который занимает 2 байта.

Выберите 5-й байт:

Выберите 5-й, 9-й и 13-й байты:

Выберите диапазон от 1-го до 5-го байта:

На момент написания этой статьи версия пакета cut в GNU coreutils не имела возможности обрезать по символам. При использовании -c параметра cut ведет себя так же, как при использовании -b параметра.

Примеры

Команда cut обычно используется в сочетании с другими командами через трубопровод. Вот несколько примеров:

Получить список всех пользователей

Выходные данные getent passwd команды передаются в cut , который печатает 1-е поле, используя в : качестве разделителя.

Посмотреть 10 наиболее часто используемых команд

В следующем примере cut используется для удаления первых 8 байтов из каждой строки history вывода команды.

Вывод

cut Команда используется для отображения выбранных полей из каждой строки заданных файлов или стандартного ввода.

Хотя это очень полезно, cut имеет некоторые ограничения. Он не поддерживает указание более одного символа в качестве разделителя и не поддерживает несколько разделителей.

Источник

Как обрезать файлы до нулевого размера в Linux

How to Truncate (Empty) Files in Linux

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

В некоторых ситуациях может потребоваться усечь (очистить) существующий файл до нулевой длины. Проще говоря, усечение файла означает удаление содержимого файла без удаления файла.

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

Shell Redirection

Самый простой и наиболее используемый метод для усечения файлов — это использование > — оператора перенаправления оболочки.

Общий формат для усечения файлов с использованием перенаправления:

  • В : средстве толстой кишки true и не производит никакого вывода.
  • Оператор > перенаправления перенаправляет вывод предыдущей команды в указанный файл.
  • filename , файл, который вы хотите усечь.

Если файл существует , он будет обрезан до нуля. В противном случае файл будет создан.

Вместо : можно также использовать другую команду, которая не выдает никаких результатов.

Вот пример использования cat команды для вывода содержимого /dev/null устройства, которое возвращает только символ конца файла:

Еще одна команда, которая может быть использована echo . -n Опция говорит echo не для добавления новой строки:

В большинстве современных оболочек, таких как Bash или Zsh, вы можете опустить команду перед символом перенаправления и использовать:

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

Есть несколько решений, которые позволяют перенаправлять с sudo . Первый вариант может запустить новую оболочку с помощью sudo и выполнить команду внутри этой оболочки, используя -c флаг:

Другой вариант — передать вывод в tee команду, повысить tee привилегии sudo и записать пустой вывод в заданный файл:

truncate команда

truncate утилита командной строки, которая позволяет уменьшить или расширить размер файла до заданного размера.

Общий синтаксис для усечения файлов до нулевого размера с помощью truncate команды, выглядит следующим образом:

Например, чтобы очистить журнал доступа Nginx, вы должны использовать:

Очистить все файлы журнала

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

Следующая команда очистит файлы, заканчивающиеся на «.log» в /var/log каталоге:

Лучшим вариантом будет вращение, сжатие и удаление файлов журналов с помощью logrotate инструмента.

Вывод

Чтобы обрезать файл в Linux, используйте оператор перенаправления, > за которым следует имя файла.

Источник

Как вырезать файл в заданный размер под Linux?

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

Первое, что приходит на ум, — это обрезать . Я следую примеру на этой странице и делаю то же самое:

Но файл все еще имеет тот же размер:

Как я могу сделать эту работу?

5 ответов

Вы можете использовать команду truncate :

SIZE может быть задан как байты, KB, K, MB, M и т. д. Я предполагаю, что вы можете вычислить желаемый размер вручную; Если нет, вы можете использовать команду stat для получения информации о текущем размере файла.

открывает файл для чтения. Однако, чтобы обрезать файл, вам нужно его изменить, поэтому дескриптор файла только для чтения не будет работать. Вам нужно использовать режим «изменить» ( «+>» ).

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

Ниже было бы несколько более полезно:

, хотя, по общему признанию, это означало бы только «недопустимый аргумент». Тем не менее, это полезная информация и вполне может привести вас к выводу, что открытый режим был неправильным (как и для меня).

Вы можете использовать хвост для сокращения до 100 000 байт

tail -c 100000 file> файл2

выходы -c, начинающиеся с байта 100000 этого файла в этом случае

заменяет исходный файл только что сгенерированным файлом

Ответ выше, цитируя truncate , хорош. dd также выполнит задание:

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

Источник

Читайте также:  Adb linux удаление приложений
Оцените статью