Linux удалить конец файла

Удаление строк из файла с использованием sed

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

Sed: удалить одну или несколько строк из файла

Вот как можно удалить одну или несколько строк из файла.

Синтаксис

n = номер строки

string = ряд символов, найденный в строке

regex = регулярное выражение, соответствующее искомому шаблону

addr = адрес строки (номер или шаблон)

d = удалить (delete)

Примеры Sed

Вот несколько примеров использования приведенного выше синтаксиса.

Используйте следующий код, чтобы удалить третью строку:

Удалите строку, содержащую ряд букв «awk», используя:

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

Или удалить все пустые строки:

Удалить строку, соответствующую регулярным выражениям (путем исключения одного из них, содержащего цифровые символы, как минимум 1 цифру, расположенные в конце строки):

Удалить интервал между строками 7 и 9:

Та же операция, что и приведенная выше, но с заменой адреса параметрами:

Вышеприведенные примеры отображают изменения только при открытии файла (stdout1 = screen).

Для постоянных изменений в старых версиях (ниже 4) используйте временный файл для GNU sed с использованием команды -i [suffix]:

Источник

Как удалить строки в Vim / Vi

Vim или его предшественник Vi предустановлен в большинстве дистрибутивов Linux и macOS. Если вы системный администратор или обычный пользователь Linux, важно знать основы Vim.

Довольно часто при работе с текстовыми файлами вам нужно удалить одну или несколько строк.

В этой статье показано, как удалять строки в Vim / Vi.

Удаление строки

Команда для удаления строки в Vim — dd .

Ниже приведены пошаговые инструкции по удалению строки:

  1. Нажмите Esc чтобы перейти в нормальный режим.
  2. Установите курсор на строку, которую хотите удалить.
  3. Введите dd и нажмите Enter, чтобы удалить строку.

Многократное нажатие dd удалит несколько строк.

Удаление нескольких строк

Чтобы удалить сразу несколько строк, добавьте к команде dd количество удаляемых строк. Например, чтобы удалить пять строк, вы должны сделать следующее:

  1. Нажмите Esc чтобы перейти в нормальный режим.
  2. Поместите курсор на первую строку, которую хотите удалить.
  3. Введите 5dd и нажмите Enter, чтобы удалить следующие пять строк.

Удалить диапазон строк

Синтаксис для удаления диапазона строк следующий:

Например, чтобы удалить строки, начинающиеся с 3 по 5, вы должны сделать следующее:

  1. Нажмите Esc чтобы перейти в нормальный режим.
  2. Введите :3,5d и нажмите Enter, чтобы удалить строки.

Вы также можете использовать следующие символы, чтобы указать диапазон:

  • . (точка) — текущая строка.
  • $ — последняя строка.
  • % — Все строки.

Вот несколько примеров:

  • . $d — От текущей строки до конца файла.
  • . 1d — От текущей строки до начала файла.
  • 10,$d — с 10-й строки до конца файла.

Удалить все строки

Чтобы удалить всю строку, вы можете использовать символ % , представляющий все строки, или диапазон 1,$ :

  1. Нажмите Esc чтобы перейти в нормальный режим.
  2. Введите %d и нажмите Enter, чтобы удалить все строки.

Удаление линий, содержащих узор

Синтаксис для удаления нескольких строк на основе определенного шаблона следующий:

Глобальная команда ( g ) указывает команде удаления ( d ) удалить все строки, содержащие

Чтобы сопоставить строки, не соответствующие шаблону, добавьте восклицательный знак ( ! ) Перед шаблоном:

Шаблон может быть буквальным соответствием или регулярным выражением . Вот несколько примеров:

  • :g/foo/d — Удалить все строки, содержащие строку «foo». Также удаляется строка, в которой «foo» вставлено в слова большего размера, например «футбол».
  • :g!/foo/d — Удалить все строки, не содержащие строку «foo».
  • :g/^#/d — Удалить все комментарии из сценария Bash. Шаблон ^# означает, что каждая строка начинается с # .
  • :g/^$/d — Удалить все пустые строки. Шаблон ^$ соответствует всем пустым строкам.
  • :g/^s*$/d — Удалить все пустые строки. В отличие от предыдущей команды, здесь также удаляются пустые строки, содержащие ноль или более пробелов ( s* ).

Выводы

Мы показали вам, как удалять строки в Vim.

Если вы новичок в Vim, посетите сайт Open Vim, где вы можете попрактиковаться в Vim с помощью интерактивного руководства.

Не стесняйтесь оставлять комментарии, если у вас есть вопросы.

Источник

Удалить последнюю строку из файла

Я использую, sed чтобы быстро удалить строки с определенной позиции, как

Но что делать, если я хочу удалить последнюю строку файла, и я не знаю количество строк (я знаю, что могу получить это, используя wc и несколько других приемов).

В настоящее время используется обходной путь head и в tail сочетании с wc этим. Какие-нибудь быстрые повороты здесь?

в sed $ последняя строка, поэтому удалить последнюю строку:

$ за последнюю строку:

cat file.txt | head -n -1 > new_file.txt

Остерегайтесь, кажется, в зависимости от последней строки file.txt (если она заканчивается EOF , или \n и затем EOF ), количество строк в new_file.txt может быть таким же (как file.txt ) после этой команды (это происходит, когда нет \n ) — в любом случае, содержимое последней строки удаляется.

Также обратите внимание, что вы должны использовать второй (промежуточный) файл. Если вы переадресовали и перенаправили на тот же файл, вы удалите его.

head —lines=-1 , Сначала я наткнулся на эту возможность в man-странице для головы в SLES11SP2-системе (coreutils-8.12-6.23.1)

tail и head являются частью coreutils -rpm (по крайней мере для систем на основе rpm).

Читайте также:  Панель команд windows 10

Согласно журналу изменений coreutils, этот синтаксис поддерживается начиная с версии coreutils 5.0.1.

Плохая новость: в соответствии с man-страницей RH5 эта опция не описана

Хорошие новости: он работает с RH5 (так в вашем случае: он работает — по крайней мере, с текущей версией RH5).

rpm -q coreutils показывает мне (на CentOS 5.8): coreutils-5.97-34.el5_8.1

Я не уверен, что RH5.5. уже имеет версию coreutils, которая ее поддерживает. Но у 5.5 все равно есть EoLed.

Источник

Удалить все строки в файле, идущие после заданной

Нужно удалить все строчки, после заданной (по номеру строки или ее содержанию) sed ‘/содержание_строки/q’ — не работает. Как правильно сделать?

sed ‘/шаблон/,$d’ имя_файла

sed ‘номер_строки,$d’ имя_файла

sed ‘/done/,$d’ /etc/init.d/generator

c=$(( c + 1 )) echo «$c» >> /etc/init.d/generator

Строки, создаваемые после done, не удаляются. С номером строки тоже не вышло. Почему?

А права на запись в файл /etc/init.d/generator есть? От рута скрипт выполняешь?

А права на правку каталога /etc/init.d/ ?

Судя по тому, что строки создаются, предположу что с правами на запись все в порядке?

Непонятно, откуда должно взяться слово «done» в файле /etc/init.d/generator ?

И дополнительный вопрос: а почему все операции именно в /etc/init.d/ ? Не лучше ли сначала отладить скрипт в «песочнице» (где-нибудь в домашнем каталоге), а уж потом смело идти в общесистемный каталог?

А по содержанию таки sed’ом лучше.

Кстати по номерам строк можно было бы и так:

head -номер_последней_нужной_строки имя_файла

Я сейчас ещё раз проверил все предложенные мной варианты на нескольких файлах. Всё работает.

Скрипт постом выше это и есть generator, добавляющий сам в себя строки. Удалять он их тоже должен (все это не лишено смысла).

С grep -B999999 «done» /etc/init.d/generator тоже не работает.

А done у тебя именно так записан, как в комменте?

Надо done на отдельную строку вынести или точку с запятой поставить:

И всё-таки остаётся вопрос: зачем подобные эксперименты в общесистемном каталоге проводить? Да ещё не вполне уверенно чувствуя себя в шелле и его инструментах, как я понял.

head -17 /etc/init.d/generator так тоже не сработало. С правами все в порядке же? Цифры записываются в конец файла. chmod +w /etc/init.d/generator ls -l /etc/init.d/generator -rwxr-xr-x 1 root root 247 Янв 26 15:16 /etc/init.d/generator

done на отдельной строке, исковеркалось. На второй вопрос ответа нет — создавал где попалось. Разве могло повлиять?

А сообщения какие-нибудь выдаёт? Или молча ничего не делает?

М-да, неотлаженные скрипты напускать на системные каталоги — это более чем смело. Я бы так не решился.

Теоретически — нет. Но на практике всякое случается.

Я скрипт скопировал, но перед запуском стал внимательно смотреть, и нихрена не понял, что он должен делать. Задача абсолютно непонятна. Зачем весь этот гемор? Цель какая?

/* Вообще-то, прежде чем отвечать, я должен был сразу этот вопрос задать, а не ковырять не-пойми-что. 🙂 */

По-моему, это называется «серп → яйца».

Вот я и смотрю: то ли человек шелл только ещё осваивает, но сразу хватается за какие-то непонятные головоломки, то ли какой-то «вирус» пытается сварганить, и истинную цель скрывает. 🙂

Мне вот абсолютно непонятна практическая цель этих извратов с самокастрированием, да ещё и в динамике, да ещё и в системном каталоге.

Пытается изобрести форк патча Бармина: «патч Цеврио».

Меня спас ключ -i, цель была изменять файл. Выходит, по неопытности я не правильно сформулировал задачу.

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

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

Для этого есть нормальный инструмент — inotify. И никаких геморных костылей не нужно.

Вот не зря же постоянно твердят: правильная формулировка и постановка задачи даёт половину её решения. 🙂

ПО мониторит файл, изменения в котором служат ему сигналом для обращения к конфигу. Файл любой, главное что бы менялся.

Можно подробнее, как http://ru.wikipedia.org/wiki/Inotify сможет в этом помочь? На сколько я понял из вики, он занимается чем то более сложным, чем генерация файлов. Я правильно думаю, что он способен принудить ПО обращаться к конфигу?

Наоборот, inotify занимается совсем простым делом: отслеживает изменения файлов и/или каталогов и выдаёт соответствующее оповещение. А ты описываешь реакцию на это оповещение, скажем, тем же скриптом.

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

Кстати, именно для скриптов есть утилитки inotifywait и inotifywatch (как пакет называется, навскидку не вспомню). Все проблемы отслеживания изменений файлов/каталогов решаются без труда.

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

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

Тогда возможен такой вариант — написание скрипта, берущего IP на интерфейсах ppp0 ppp1 ppp2 и т.д. и отправляющего их в нужный конфиг ПО, а inotify будет запускать этот скрипт, в случае если адреса поменяются?

Но с другой стороны очередной костыль, уже второй после скрипта. Я хотел обойтись только скриптом, просто заставить ПО каждые 5-10 секунд обращаться к своему конфигу. Можно было бы без интервалов, а с проверкой смены адреса на интерфейсе, но ddns хосты могут обновляться несколько минут — inotify сможет проверять в них значение IP?

Если ПО остлеживает изменение по дате последнего изменения файла, то man touch.

Читайте также:  Command windows delete files from

Источник

Команда cut Linux

Команда cut используется, если нужно вырезать часть текста — при этом он может находиться в файле либо быть напечатанным через стандартный ввод. В Unix-системах эта команда удаляет секции текста, которые были обозначены при помощи байтов, символов или полей, разделенных знаками «-« и «:». Работу cut обеспечивает одноименная утилита. Она входит в состав GNU Coreutils, так что по умолчанию доступна во всех дистрибутивах Linux. Также ею можно воспользоваться на машинах с операционной системой BSD.

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

Синтаксис команды cut

Написание команды cut выглядит следующим образом:

$ cut опции путь_к_файлу

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

Параметры cut

Список опций, которые позволяют управлять поведением команды:

  • -b (—bytes=LIST) — номер байта, набор или диапазон байтов, подлежащих вырезанию.
  • -c (—characters=LIST) — символ, который следует вырезать. Также можно указывать набор либо диапазон символов.
  • -d (—delimiter=DELIM) — с помощью этой опции пользователь устанавливает свой разделитель вместо стандартного TAB.
  • -f (—fields=LIST) — перечень полей для вырезания.
  • -s (—only-delimited) — если была применена эта опция, cut не выводит строки, где нет разделителя.
  • —complement — задает байты, символы или поля, которые останутся в файле или тексте из стандартного ввода. Все остальное будет вырезано.
  • —output-delimiter=STRING — по умолчанию выходной разделитель соответствует входному. Эта опция позволяет задать другой выходной разделитель.
  • -z, —zero-terminated — вместо символа новой строки разделителем будет NULL.

Это основные параметры команды cut, которые нам понадобятся при работе с утилитой.

Примеры использования cut в Linux

Прежде всего создадим файл cut_command_example.txt и поместим его в домашнюю директорию. В теле документа пропишем текст:

Winter: white: snow: frost
Spring: green: grass: warm
Summer: colorful: blossom: hot
Autumn: yellow: leaves: cool

1. Работа с байтами

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

Чтобы вырезать из текста, напечатанного через стандартный ввод, первый символ, команда cut должна иметь вид:

echo «The sky was yellow as brass.» | cut -b 1

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

echo «I looked at my watch; not eight o’clock.» | cut -b 5,8,17

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

echo «Still I opened the gate, and put the petrol pump in readiness.» | cut -b 38-43

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

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

cut -b 1,9 cut_command_example.txt

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

Примерно так же работает вырезание символов в заданном диапазоне. Диапазон — это два числа, написанные через дефис:

cut -b 12-20 cut_command_example.txt

Команду cut можно использовать саму по себе, но не возбраняется сочетать с другими командами. Чаще всего используется sort. Попробуем вырезать первые 4 символа и расположить строки в алфавитном порядке:

cut -b 1-7 cut_command_example.txt | sort

Для сортировки по алфавиту команде sort не нужны дополнительные опции. А вот чтобы расположить строки в обратном порядке, следует добавить к записи -r:

cut -b 1-7 cut_command_example.txt | sort -r

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

cut -b 5- cut_command_example.txt

А чтобы были вырезаны все символы, начиная с первого байта и заканчивая шестнадцатым, дефис должен находиться справа от числа:

cut -b -25 cut_command_example.txt

Точно так же дефис используется, если текст задан не из файла, а через стандартный ввод:

echo «The pallid sunlight through the window shone upon my hands.» | cut -b -35

echo «The pallid sunlight through the window shone upon my hands.» | cut -b 35-

2. Работа с символами

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

echo «She offered to help me, but that was not allowed.» | cut -c 1

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

echo «We worked till dusk, then washed and dressed.» | cut -c 12,31,45

При работе с символами можно использовать диапазоны значений, точно так же, как и при работе с байтами.

echo «The two cars were now racing side by side along the straight road.» | cut -c 17-52

Нередко возникает необходимость вырезать часть текста из готового документа. Чтобы сделать это, достаточно выполнить команду

Читайте также:  Taskkill для windows 10

cut -c 18,25 cut_command_example.txt

Как видно на скриншоте, были вырезаны восемнадцатый и двадцать пятый символы в каждой из строк.

Если же вырезать только первый символ в каждой строке при помощи команды

cut -c 1 cut_command_example.txt

результат будет таким же, как и у команды

cat cut_command_example.txt | cut -c 1

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

cut -c 7-34 cut_command_example.txt

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

cut -c 1-9 cut_command_example.txt | sort

Расстановка символов в обратном порядке — начиная с конца алфавита — требует применения опции -r:

cut -c 1-9 cut_command_example.txt | sort -r

Уже известный нам трюк с дефисом возле числа можно повторить и в данном случае:

echo «We had had fights for the same reason before now.» | cut -c 12-

Будет вырезана последовательность символов, начиная с двенадцатого и заканчивая последним в строке.

А чтобы вырезать символы, начиная с первого и заканчивая двенадцатым, дефис следует переместить влево:

echo «We had had fights for the same reason before now.» | cut -c -12

С текстом, содержащимся в файле, поступают аналогично:

cut -c -8 cut_command_example.txt

cut -c 8- cut_command_example.txt

Команда вырезает текст в каждой из строк, согласно заданным параметрам.

3. Работа со столбцами

Создавая файл cut_command_example.txt, мы отделяли слова друг от друга не только пробелами, но и двоеточиями. Наконец пришло время использовать эти знаки на практике. А нужны они для того, чтобы вырезать фрагменты текста из столбцов и называются разделителями. Кроме двоеточий и пробелов в качестве разделителей можно использовать дефисы.

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

echo «From the inn issued a smell of frying liver.» | cut -d ‘ ‘ -f 1

В случае с текстовым файлом результат такой же — первое слово каждого столбца напечатано в терминале:

cut -d ‘:’ -f 1 cut_command_example.txt

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

echo «He was extraordinarily particular about politeness in others.» | cut -d ‘ ‘ -f 1,2,3

В данном примере ее результатом должны быть первые три слова — He was extraordinarily.

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

cut -d ‘:’ -f 1,2,3 cut_command_example.txt

Из файла были вырезаны три первые столбца, а их содержимое выведено в терминал.

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

echo «Surprised, we looked at one another.» | cut -d ‘ ‘ -f 1-5

Как и ожидалось, были вырезаны столбцы (слова) с первого по пятый. Обратите внимание на два апострофа, которые из раза в раз появляются в записи команды при работе с текстом из стандартного ввода. Эти знаки необходимы, если разделителем является символ пробела. Теперь вырежем диапазон полей из файла:

cut -d ‘:’ -f 1-3 cut_command_example.txt

Точно так же, как раньше сортировали вырезанные символы, мы можем поступить и сейчас — расставить названия сезонов из файла в алфавитном порядке:

cut -d ‘:’ -f 1 cut_command_example.txt | awk ‘‘ | sort

Меняя числовое значение опции -f, можно вырезать и сортировать содержимое других столбцов. Отсортировать названия сезонов в обратном порядке поможет опция -r, добавленная к команде sort:

cut -d ‘:’ -f 1 cut_command_example.txt | awk ‘‘ | sort -r

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

echo «We became still more friendly.» | cut -d ‘ ‘ -f 2-

Переместив дефис влево, мы сделаем этот столбец последним, а вырезать слова команда будет, начиная с первого столбца.

echo «We became still more friendly.» | cut -d ‘ ‘ -f -2

Работа этой команды с текстовыми файлами не имеет принципиальных отличий:

cut -d ‘:’ -f 2- cut_command_example.txt

cut -d ‘:’ -f -2 cut_command_example.txt

Команда cut также пригодится при работе с массивными CSV-документами. Ее синтаксис и опции в этом случае остаются неизменными. Например, при таком написании будут вырезаны первые два столбца файла с названием file_example.csv:

cut -d ‘,’ -f 1,2 file_example.csv

Выводы

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

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

Нет похожих записей

Оцените статью:

Об авторе

Автор: Rubaiat Hossain

Больше восьми лет назад мною было принято решение объявить бойкот оконной монополии и установить на свой компьютер Ubuntu. С тех пор это моя основная ОС. Иногда в порядке эксперимента «подселяю» к ней собратьев из семьи Linux. Увлекаюсь фотографией и горным туризмом. В свободное от работы время пишу статьи для losst.ru.

6 комментариев

Когда в ГУЕ прог тьма, то она на фиг не нужна, но знать её надо.?

Да. Такое впечатление, будто вы не представляете работу в GNU без графической оболочки и где вообще можно применять консольные утилиты.

Это надо для написания скриптов в основном

товарищи, а как вырезать предпоследнее и последнее поле, если не знаешь общее количество полей?
(например, uslugi.mos.ru — > mos.ru или m.pay.vk.com ->vk.com)

нашел,
awk -F. ‘
но столкнулся с проблемой если запись с номером (FN-1) отсутствует, выдаёт ошибку

Через rev:
echo » One Two Three» | rev | cut -d ‘ ‘ -f -2 | rev
> Two Three
echo » One Two Three Four Five» | rev | cut -d ‘ ‘ -f -2 | rev
> Four Five

Источник

Оцените статью