Написать скрипт который удаляет из текстового файла пустые строки
Это статья про SED.
Вам могут пригодится также статьи AWK и GREP
Примеры я показываю в Bash под Windows 10 или в Bash в Linux .
Удалить комментарии
Допустим, у вас есть код или просто текст в котором много комментариев.
Рассмотрим файл websites
Чтобы удалить строки с комментариями выполните
Опция -i позволяет изменять текущий файл
Если хотите сохранить исходный файл а текст без комментариев записать в новы (если вы уже удалили комментарии - убедитесь, что вы их вернули обратно)
Опция -i не нужна так как исходный файл мы не изменяли
Чтобы удалить строки с комментариями и пустые строки выполните
Основные команды Sed
Для того чтобы применить SED достаточно ввести в командную строку
echo ice | sed s / ice / fire /
Обратите внимание на то, что использовать / не обязательно.
Вы можете после s поставить какой-то другой символ, например : или , или |
Результат будет тем же, главное, чтобы все три разделителя были одинаковыми и сам символ был без дополнительных смыслов.
echo mice | sed s / m / r /
echo mice | sed s , m , r ,
echo mice | sed s : m : r :
Если вы выбрали |, то команду нужно взять в кавычки - у | есть особая роль в bash - pipeline
echo mice | sed 's|m|r|'
Если вы редактируете пути до файлов (а они содержат /) то это как раз тот случай, когда удобно выбрать другой разделитель
Например, нужно заменить /bin/bash на /bin/sh
Намного удобнее использовать @ как разделитель чем экранировать каждый слеш.
Сравните две идентичные команды
sed 's @ /bin/bash @ /bin/sh @ ' /etc/passwd
sed 's / \ /bin \ /bash / \ /bin \ /sh / ' /etc/passwd
Экранирование символов в sed
Специальные символы экранируются с помощью \
Что включать в специальные символы зависит от того, какой sed вы используете, но $.*[\^ а также пробелы и кавычки советую экранировать всегда.
Пробел также можно заменять на \s
Пример экранирования точек и кавычек для смены локали в CentOS можете изучить здесь
Предположим, что есть файл input.txt следующего содержания
Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float it / has a Name
Мы хотим отбросить всё, что находится левее /a, включая /a, и записать в файл.
sed 's/^.*/a//' > output.txt
В результате получим ошибку
Чтобы команда заработала нужно добавить \ перед /
sed 's/^.*\/a//' > output.txt
Here is a String Here is an Integer Here is a Float
Экранирование пробелов может пригодиться при замене одной фразы на другую
-=== СПОСОБ 4 — Использование утилиты CAT ===-
Используйте команду cat для удаления пустых строк из файла.
- main.txt — Это исходный файл, из которого нужно удалить пустые строки.
- output_file.txt — Будет служить файлом без пустых строк.
И так, запускаем:
Удалить всё после определённой строки
Допустим Вы хотите удалить все строки после третьей
sed 3q input.txt > output.txt
Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых
Введение в UNIX-системы
Работа в консоли
Просмотреть содержимое директорий /etc, /proc, /home. Посмотреть пару произвольных файлов в /etc.
- Используя команду ls /$DIRNAME просматриваем содержимое директории. Команда cat /etc/$FILENAME позволяет просмотреть файлы
Выяснить, для чего предназначена команда cat. Используя данную команду, создать два файла с данными, а затем объединить их. Просмотреть содержимое созданного файла. Переименовать файл, дав ему новое имя.
Создать несколько файлов. Создать директорию, переместить файл туда. Удалить все созданные в этом и предыдущем задании директории и файлы.
- Переместить файл в директорию можно командой mv $FILENAME $DIRNAME . Удаляем все файлы командой rm -r находясь в директории практического занятия
В ОС Linux скрытыми файлами считаются те, имена которых начинаются с символа “.”. Сколько скрытых файлов в вашем домашнем каталоге? (Использовать конвейер. Подсказка: для подсчета количества строк можно использовать wc.)
- Конвейер ls -ld .?* | wc -l выведет количество скрытых файлов в текущей директории, в моем домашнем каталоге их 16
- Командой cat /etc/* 2> catalogs отправляем ошибочные выводы в файл "catalogs", потом считаем строки в файле wc -l catalogs . У меня вышло 126
Запустить в одном терминале программу, а в другом терминале посмотреть PID процесса и остановить с помощью kill, посылая разные типы сигналов. Что происходит?
- В зависимости от типа сигнала процесс переходит в определенный статус, например kill -9 $PID завершит процесс сразу
Отобразить в /dev список устройств, которые в настоящее время используются вашим UID (для этого используется команда lsof). Организовать конвейер через less, чтобы посмотреть их должным образом.
Cоздать директорию для хранения фотографий. В ней должны быть директории по годам (например, за последние 5 лет), и в каждой директории года — по директории для каждого месяца.
Заполнить директории файлами вида ГГГГММДДНН.txt. Внутри файла должно быть его имя. Например: 2018011301.txt, 2018011302.txt.
- Используем команду ls -lA в сочетании с конвейером для выполнения условий задания. Вывод:
- добавляем |wc -l и подстчет выдает нам 10 типов разрешений
Файлы и права доступа в Linux
Создать файл file1 и наполнить его произвольным содержимым. Скопировать его в file2. Создать символическую ссылку file3 на file1. Создать жесткую ссылку file4 на file1. Посмотреть, какие айноды у файлов. Удалить file1. Что стало с остальными созданными файлами? Попробовать вывести их на экран.
- Файлы file1 и file4 будут иметь одинаковые айноды. После удаления останутся все файлы, кроме file1, при этом символическая ссылка будет битой, а при входе по ней в текстовый редактор будет создан новый файл file1.
Дать созданным файлам другие, произвольные имена. Создать новую символическую ссылку. Переместить ссылки в другую директорию.
- Как от переименования, так и от перемещения пострадают только символьные ссылки, так как они будут ссылаться или не натот файл, или не по тому пути.
Создать два произвольных файла. Первому присвоить права на чтение, запись для владельца и группы, только на чтение — для всех. Второму присвоить права на чтение, запись — только для владельца. Сделать это в численном и символьном виде.
- chmod 664 file1 && chmod 644 file2 в числовом виде и chmod ug=rw,o=r file1 && chmod u=rw,og=r file2 в символьном(можно также использовать +-, если известны права доступа).
Создать пользователя, обладающего возможностью выполнять действия от имени суперпользователя.
- на выбор useradd или adduser быстрее всего сделать одной командой useradd -m -G sudo -s /bin/bash adminuser
Создать группу developer и несколько пользователей, входящих в нее. Создать директорию для совместной работы. Сделать так, чтобы созданные одними пользователями файлы могли изменять другие пользователи этой группы.
- Создаем группу командой groupadd developer , затем создаем новых пользователей командами из предыдущей задачи указав необходиму группу или добавляем существующих пользователей в группу при помощи usermod -aG developer $USERNAME . На каталоге меняем группу рекурсивно chgrp -R developer , затем меняем права chmod -R 2775 newpol 2 - setGID означает, что все новые файлы наследуют группу каталога.
Создать в директории для совместной работы поддиректорию для обмена файлами, но чтобы удалять файлы могли только их создатели.
- Если добавить атрибут t на каталог, то удалить файлы из него смогут только владельцы
Создать директорию, в которой есть несколько файлов. Сделать так, чтобы открыть файлы можно было, только зная имя файла, а через ls список файлов посмотреть было нельзя.
Bash, скрипты и автоматизация
Написать скрипт, который удаляет из текстового файла пустые строки и заменяет маленькие символы на большие (воспользуйтесь tr или sed).
- Скрипт chscript.sh для выполнения указанной задачи добавлен в репозиторий
Создать скрипт, который создаст директории для нескольких годов (2010 — 2017), в них — поддиректории для месяцев (от 01 до 12), и в каждый из них запишет несколько файлов с произвольными записями (например, 001.txt, содержащий текст«Файл 001», 002.txt с текстом Файл 002) и т. д.
- Скрипт dirmaker.sh для выполнения указанной задачи добавлен в репозиторий
Создать файл crontab, который ежедневно регистрирует занятое каждым пользователем дисковое пространство в его домашней директории.
- Задачу cron нужно запустить от root пользователя, чтобы иметь доступ ко всем данным. Строка команды в crontab будет выглядеть так @daily date >> /var/log/diskspacemonitor; du -hs /home/* >> /var/log/diskspacemonitor
Создать скрипт ownersort.sh, который в заданной папке копирует файлы в директории, названные по имени владельца каждого файла. Учтите, что файл должен принадлежать соответствующему владельцу.
- Скрипт ownersort.sh добавлен в репозиторий, настроен на копирование без рекурсии, для копирования всех файлов убрать -maxdepth 1 из параметров
Сетевые возможности Linux
Произвести ручную настройку сети в Ubuntu.
- задаем адрес c помощью ifconfig предварительно установив пакет net-tools. ifconfig eth0 10.10.10.10 netmask 255.255.255.0 , затем добавляем роут route add default gw 10.10.10.1 eth0
Переключить настройку сети на автоматическую через DHCP, проверить получение адреса.
- переходим в директорию /etc/network/interfaces прописываем следующие строки и перезапускаем службу networking
- Способов несколько, один из них добавление в /etc/network/interfaces строки dns-nameservers 1.1.1.1 , я отредактировал файл /etc/resov.conf, до перезагрузки будут действовать установленные настройки
Настроить правила iptables, чтобы из внешней сети можно было обратиться только к портам 80 и 443.
- Очищаем текущие правила приема iptables -F INPUT добавляем новые
Дополнительно к предыдущему заданию настроить доступ по ssh только из указанной сети.
Иногда, у нас имеются файлы и в них много пустых строк — это не очень удобно (по крайней мере для чтения). Файлы можно отредактировать вручную, если файл имеет несколько пустых строк, но если файл имеет тысячи пустых строк, это трудно сделать вручную. Используйте один из следующих методов для удаления пустых строк из файла.
Отбросить всё, что правее определённого слова
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float / it has a Name
Мы хотим отбросить всё, что находится правее слова is, включая слово is, и записать в файл.
sed 's/is.*//' > output.txt
Удаление переходов на новую строку
sed ':a;N;$!ba;s/\n//g' file ;
-=== СПОСОБ 5 — Использование утилиты TR ===-
Используйте команду cat для удаления пустых строк из файла.
- main.txt — Это исходный файл, из которого нужно удалить пустые строки.
- output_file.txt — Будет служить файлом без пустых строк.
Если появятся еще идеи. Я дополню данную тему!
Вот и все, статья «Удалить пустые строки с файла в Unix/Linux» завершена.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Удалить строку в которой нет определённого паттерна
Для таких операций можно использовать !d - это противоположная d операция - удалятся строки где паттерна нет, то есть останутся те, где паттерн присутствует.
sed ' / паттерн / !d ' file
Можно использовать -n
sed -n ' / паттерн / p ' file
Например в файле visited.log Есть строки вида
sed ' / heihei / !d ' visited.log > hh.log
cat hh.log
Отбросить всё, что левее определённого слова
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String it has a Name Here is an Integer it has a Name Here is a Float it has a Name
Мы хотим отбросить всё, что находится левее слова it, включая слово it, и записать в файл.
sed 's/^.*it//' input.txt > output.txt
^ означает, что мы стартуем с начала строки Результат:
Для доступности объясню синтаксис сравнив две команды. Посмотрите внимательно, когда мы заменяем слово Here на There.
There находится между двумя слэшами. Раскрашу их для наглядности в зелёный и красный.
sed 's/Here/There/'
А когда мы хотим удалить что-то, мы сначала описываем, что мы хотим удалить. Например, всё от начала строки до слова it.
Теперь в правой части условия, где раньше была величина на замену, мы ничего не пишем, т.е. заменяем на пустое место. Надеюсь, логика понятна.
sed 's/^.*it//' > output.txt
Сделать замену
За замену отвечает опция s про неё вы можете прочитать отдельную статью sed s - substitute
-=== СПОСОБ 2 — Использование perl ===-
И так, чтобы удалить пустые строки в файлу (у меня это main.txt), используйте:
Получить диапазон строк
В случае, когда Вы работаете с большими файлами, например с логами, часто бывает нужно получить только определённые строки, например, в момент появления бага.
Копировать из UI командной строки не всегда удобно, но если Вы примерно представляете диапазон нужных строк - можно скопировать только их и записать в отдельный файл.
Например, Вам нужны строки с 9570 по 9721
sed -n '9570,9721p;9722q' project-2019-10-03.log > bugFound.txt
Удалить что-то из файла
За удаление отвечает опция d про неё вы можете прочитать отдельную статью sed d
Также можно удалять заменой на пустое место
И удалять с помощью других опций, например, q
Два условия одновременно в Sed
Предположим, что у нас есть файл input.txt следующего содержания
Here is a String /b it has a Name Here is an Integer /b it has a Name Here is a Float /b it has a Name
Мы хотим отбросить всё, что находится левее /b, включая /b, и всё, что правее has.
Таким образом, в каждой строчке должно остаться только слово it.
sed 's/^.*\/b// ; s/has.*//' input.txt > output.txt
Удалить строку со словом
Удалить все строки где встречается слово Apple в файле input.txt
Here is an Apple Here Pen Here ApplePen Integer is Here Here is a Float Here Pen Here Pineapple Here PineapplePen Umm Apple Apple Apple Pen
Сделать это можно с помощью опции d
sed '/Apple/d' input.txt > output.txt
Integer is Here Here is a Float Here Pen Here Pineapple Here PineapplePen
Усложним условие - удалим все строки где есть слово Pineapple и слово Integer
sed '/Pineapple\|Integer/ d ' input.txt > output.txt
| выступает в роли логического ИЛИ
\ нужна чтобы экранировать |
Here is an Apple. Here is a Pen. Here is an ApplePen Here is a Float Umm Apple Apple Apple Pen
Удаление без d
Удалять из файлов можно и без применения d
Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых
1. Написать скрипт, который удаляет из текстового файла пустые строки и заменяет маленькие символы на большие. Воспользуйтесь tr или SED.
Заменить символы в строке - все маленькие латинские буквы b на большие B
Помогите пожалуйста. Нужна программа которая заменяла бы в строке все маленькие латинские буквы b.
Из текстового файла удалить все пустые строки
Из текстового файла удалить все пустые строки. Пустой считать строку, не содержащую символов или.
Из текстового файла удалить все пустые строки.
Из текстового файла удалить все пустые строки. Пустой считать строку, не содержащую символов или.
Во введённом с клавиатуры слове заменить, начиная с 4-го символа, все маленькие символы на большие и наоборот
Необходимо в введённом с клавиатуры слове заменить начиная с 4-го символа все маленькие символы на.
Удалить из текстового файла пустые строки, изменить данный файл
Удалить из текстового файла пустые строки и лишние пробелы, не создавая 2й файл. (изменение.
Заменить в тексте все большие латинские буквы на маленькие, не изменяя все остальные символы
Цель работы: Сформировать понятие величин строкового типа. Научиться составлять алгоритмы обработки.
Переписать строки файла заменяя все маленькие буквы на большие
Дан текстовый файл F.txt. Переписать строки файла F.txt в файл G.txt, заменяя все маленькие буквы.
Из текстового файла удалить лишние пробелы и непечатные символы (кроме табуляции и конца строки)
Вот её условие:Из текстового файла удаляются лишние пробелы и непечатные символы (кроме табуляции и.
Как преобразовать в строке все маленькие буквы в большие а большие в маленькие?
Дана строка .Преобразовать в ней все маленькие буквы в большие а большие в маленькие. Вот что я.
Большие и маленькие символы в массиве
Здравствуйте. Помогите пожалуйста решить задачку: Дан массив символов, содержащий как большие, так.
Удалить комментарии и пустые строки
Удалить пустые строки
Если строка действительно пустая, то подойдёт команда
Обычно жизнь более жестока, и в строках содержатся пробелы.
Удалить такие строки тоже можно
$ sed ' / ^[[:space:]]*$ / d ' input.txt > output.txt
Удалить первые несколько строк
Допустим Вы хотите удалить три первые строки файла example.txt
sed -i -e 1,3 d example.txt
Создать функцию
Чтобы каждый раз не вспоминать команды sed можно создать функцию
Возьмём команду, которая удаляет комментарии и пустые строки из предыдущего примера и запишем как функцию clean_file.
Первым делом в коносли нужно написать в терминале function clean_file < и нажать Enter
$1 означает, что функция будет принимать один аргумент. Это, конечно, будет название файла.
Затем нужно снова нажать Enter и в новой строке написать > и нажать Enter ещё раз
Убедитесь, что файл содержит комментарии и пустые строки. Если нет - создайте для чистоты эксперимента.
clean_file websites
cat websites
-=== СПОСОБ 3 — Использование утилиты AWK ===-
Используйте команду awk для удаления пустых строк из файла.
- main.txt — Это исходный файл, из которого нужно удалить пустые строки.
- output_file.txt — Будет служить файлом без пустых строк.
И так, запускаем:
Заменить всё между определёнными символами
Удалить всё что находится между квадратными скобками включая скобки
sed 's/\[.*\]//' input.txt > output.txt
-=== СПОСОБ 1 — Использование утилиты SED ===-
Sed потоковый редактор. С помощью этой утилиты, можно легко удалить все пустые строки. Используйте одну из следующих команд sed для удаления пустых строк из файла.
- main.txt — Это исходный файл, из которого нужно удалить пустые строки.
- output_file.txt — Будет служить файлом без пустых строк.
Читайте также: