- Удалить последнюю строку из файла
- Как в консоли вывести все строчки кроме последней
- Удаление строк из файла с использованием sed
- Sed: удалить одну или несколько строк из файла
- Синтаксис
- Примеры Sed
- linux-notes.org
- Утилита tail в примерах Unix/Linux
- Удалить последнюю строку из файла в Bash
- 11 ответов:
- Для Пользователей Mac:
- Пояснение:
Удалить последнюю строку из файла
Я использую, 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).
Согласно журналу изменений 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.
Источник
Как в консоли вывести все строчки кроме последней
Задача. В консоли есть какой-то текст (вывод какой-то команды или содержимое файла). Зарнее неизвестно сколько в этом тексте строк. Нужно вывести на экран все строчки, кроме последней.
Самый простой способ это сделать в linux — это использовать команду head и передать ей отрицательное число в значении параметра -n
Вот пример. Есть команда, которая выдает три строчки на экран:
Передамем -1 (минус один) в качестве параметра -n для head и получаем все строчки, кроме последней:
И можно указать не только -1 (чтобы получить все строчки, кроме последней), но и -2 (чтобы получить все строчки, кроме двух последних) или -3 (все, кроме трех последних) и т.д.
Конечно, если заранее знать сколько всего строк, то можно использовать не отрицательное значение, а положительное значение — просто сказать — покажи первые 2 строчки:
Но отрицательный параметр очень удобен, когда заранее неизвестно сколько строчек нужно обработать.
Вот фрагмент хелпа к команде head, которое описывает параметр -n:
К сожалению, на macOS отрицательные значения параметра -n не работают. На маке живет BSD верия head (на linux GNU версия) и на маке попытка указать отрицательный параметр выдает ошибку:
Для того чтобы на macOS вывести все строчки, кроме последний можно использовать вот такой однострочник:
(в самом конце этого однострочника находится число -1. Если нужно показать все строчки, кроме двух последних, то нужно вместо -1 написать -2, если нужно показать все строчи кроме трех последних, то -3, и т.д.)
Другое возможное решение на macOS — установить пакет coreutils с помощью Homebrew:
И использовать ghead команду с отрицательнм значением парметра -n:
Источник
Удаление строк из файла с использованием sed
В Unix команда SED удаляет одну или несколько строк из указанного файла по желанию пользователя. Эта утилита используется для работы с командной строкой Unix, для удаления из файла выражений, которые могут быть идентифицированы с помощью определяющего разделителя (например, запятая, табуляция или пробел), по номеру строки или путем поиска строки, выражения или адреса строки в синтаксисе sed.
Sed: удалить одну или несколько строк из файла
Вот как можно удалить одну или несколько строк из файла.
Синтаксис
n = номер строки
string = ряд символов, найденный в строке
regex = регулярное выражение, соответствующее искомому шаблону
addr = адрес строки (номер или шаблон)
d = удалить (delete)
Примеры Sed
Вот несколько примеров использования приведенного выше синтаксиса.
Используйте следующий код, чтобы удалить третью строку:
Удалите строку, содержащую ряд букв «awk», используя:
Вы можете удалить последнюю строку, введя:
Или удалить все пустые строки:
Удалить строку, соответствующую регулярным выражениям (путем исключения одного из них, содержащего цифровые символы, как минимум 1 цифру, расположенные в конце строки):
Удалить интервал между строками 7 и 9:
Та же операция, что и приведенная выше, но с заменой адреса параметрами:
Вышеприведенные примеры отображают изменения только при открытии файла (stdout1 = screen).
Для постоянных изменений в старых версиях (ниже 4) используйте временный файл для GNU sed с использованием команды -i [suffix]:
Источник
linux-notes.org
Команда tail в операционных системах UNIX или Linux используется для вывода последних N строк из файла на терминал. Команда tail особенно используется с лог-файлами, чтобы вывести последние несколько строк, чтобы знать о ошибках. Синтаксис команды tail таков:
Параметры команды tail таковы:
- c : Выводит последние N байт указанного файла; Выводит + печатает символы N байт в файле.
- n : Выводит последние N строк; Выводит + печатает строки из N-го количества строк в файле.
- f : Вывод строк в режиме реального времени ( выводит когда появляются новые строки в файле).
Утилита tail в примерах Unix/Linux
В своей статье «Утилита tail в примерах Unix/Linux» я хотел бы рассказать о замечательной утилите tail и привести готовые примеры использования.
Создайте следующий файл use_tail.txt в операционной системе Linux или Unix для практикующих примеров со следующим содержанием:
Вывод последних 10 строк.
По умолчанию, команда tail печатает последние 10 строк из файла:
Вывести последние N строк.
Используйте опцию «-n», чтобы напечатать последние N строк из файла. Следующий пример печатает последние 3 строки из файла:
Вывести строки из N-й строки.
Вы можете печатать строки, начиная с N-й строки в файле. Следующий пример печатает строки начиная с 4-й линии:
Вывести последние n байт.
Использовать опцию «-c» для вывода последних N байт из файла. Следующий пример печатает последние 7 байт из файла:
5. Print characters from the Nth byte
Используйте следующий символ «+» с опцией «-c» чтобы печатать символы с N-го байта. Следующий пример печатает символы с 69-го байта.
Выводить последние строки из файла динамически (в режиме реального времени).
Опция «-f» выводит строки из файла, который динамично растет. При запуске команды «tail -f» с именем файла, он будет печатает последние 10 строк и ожидать новых линий, которые будут добавлены в файл. Всякий раз, когда новые линии добавляется в файл, команда tail также добавляет новые строки на стандартный вывод (на терминал). Опция «-f» полезна при отладке приложений.. Вы можете использовать опцию «-f», чтобы начать анализировать вывод разных ошибок в режиме реального времени:
На этом, у меня все, тема «Утилита tail в примерах Unix/Linux» завершена.
Источник
Удалить последнюю строку из файла в Bash
У меня есть файл, foo.txt , содержащий следующие строки:
Мне нужна простая команда, в результате которой содержимое foo.txt будет:
11 ответов:
Опция -i не существует в версиях GNU sed старше 3.95, поэтому вы должны использовать ее в качестве фильтра с временным файлом:
Конечно, в этом случае вы также можете использовать head -n -1 вместо sed .
Это, безусловно, самое быстрое и простое решение, особенно для больших файлов:
Если вы хотите удалить верхнюю строку, используйте следующее:
, Что означает выходные линии, начинающиеся со строки 2.
Не используйте sed для удаления строк из верхней или нижней части файла-это очень медленно, если файл большой.
У меня были проблемы со всеми ответами здесь, потому что я работал с огромным файлом (
300 ГБ), и ни одно из решений не масштабировалось. Вот мое решение:
В словах: узнайте длину файла, который вы хотите закончить (длина файла минус длина его последней строки, используя bc ), и установите эту позицию, чтобы быть концом файла (путем dd ing один байт /dev/null на него).
Это быстро, потому что tail начинает чтение с конца, и dd перезапишет файл на месте вместо копирования (и разбора) каждой строки файла, что и делают другие решения.
Примечание: это удаляет строку из файла на месте! Сделайте резервную копию или протестируйте фиктивный файл, прежде чем опробовать его на своем собственном файле!
Чтобы удалить последнюю строку из файла , не читая весь файл и ничего не переписывая , можно использовать
Чтобы удалить последнюю строку и также распечатать ее на stdout («pop» it), вы можете объединить эту команду с tee :
Эти команды могут эффективно обрабатывать очень большой файл. Это похоже на ответ Йоси и вдохновлено им, но позволяет избежать использования нескольких дополнительных функций.
Если вы собираетесь использовать их повторно и хотите обработки ошибок и некоторые другие функции, вы можете использовать команду poptail здесь: https://github.com/donm/evenmoreutils
Если вы хотите удалить только последнюю строку вывода без изменения самого файла, сделайте
sed -e ‘$ d’ foo.txt
Если вы хотите удалить последнюю строку самого входного файла, сделайте
Для Пользователей Mac:
На Mac, head-n -1 не будет работать. И я пытался найти простое решение [ не беспокоясь о времени обработки], чтобы решить эту проблему только с помощью команд «head» и/или «tail».
Я попробовал следующую последовательность команд и был счастлив, что смог решить ее, просто используя команду «tail» [с опциями, доступными на Mac ]. Итак, если вы находитесь на Mac и хотите использовать только «хвост» для решения этой проблемы, вы можете использовать следующую команду:
Кот файл.txt / tail-r / tail-n +2 / tail-r
Пояснение:
1> tail-r: просто меняет порядок строк на своем входе
2> tail-n +2: выводит все строки, начиная со второй строки на входе
По существу, этот код говорит следующее:
Для каждой строки после первой выведите буферизованную строку
Для каждой строки сбросьте буфер
Буфер запаздывает на одну строку, поэтому вы в конечном итоге печатаете строки от 1 до n-1
Оба эти решения представлены здесь в других формах. Я нашел их немного более практичными, ясными и полезными:
Источник