Linux вставить несколько строк в файл

Bash: Запись в файл

Одной из самых распространенных задач при написании сценариев Bash или работе в командной строке Linux является чтение и запись файлов.

В этой статье объясняется, как записать текст в файл в Bash, используя операторы перенаправления и команду tee.

Запись в файл с помощью операторов перенаправления вывода

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

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

Оператор перенаправления > записывает вывод в заданный файл. Если файл существует, он усекается до нулевой длины. В противном случае файл создается. Будьте очень осторожны при использовании этого оператора, так как вы можете перезаписать важный файл.

Оператор перенаправления >> добавляет вывод в заданный файл. Файл создается, если он не существует.

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

Вот простой пример, показывающий, как перенаправить вывод команды echo в файл:

echo "this is a line" > file.txt

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

set -o noclobber echo "this is a line" > file.txt

Оператор >| позволяет отменить опцию Bash «noclobber»:

set -o noclobber echo "this is a line" >| file.txt

Оператор >> добавляет вывод в конец файла, а не перезаписывает его:

echo "this is a line" >> file.txt

Используйте команду printf для создания сложного вывода:

printf "Hello, I'm %s.\n" $USER > file.txt

Если вы хотите записать в файл несколько строк, используйте перенаправление Here document (Heredoc).

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

cat file.txt Текущий рабочий каталог: $PWD Вы вошли в систему под именем $(whoami) EOF

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

cat > file.txt Текущий рабочий каталог: $PWD Вы вошли в систему как $(whoami) EOF

Вы можете записать вывод любой команды в файл:

date +"Year: %Y, Month: %m, Day: %d" > file.txt

Вывод команды date будет записан в файл.

Запись в файл с помощью команды tee

Команда tee читает со стандартного ввода и записывает на стандартный вывод и в один или несколько файлов одновременно.

echo "this is a line" | tee file.txt

По умолчанию команда tee перезаписывает указанный файл, как и оператор >. Чтобы добавить вывод в файл, вызовите команду с опцией -a (—append):

echo "this is a line" | tee -a file.txt

Если вы не хотите, чтобы tee писал в стандартный вывод, вы можете перенаправить его в /dev/null:

echo "this is a line" | tee file.txt >/dev/null

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

echo "this is a line" | tee file_1.txt file_2.txt file_3.txt

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

echo "this is a line" | sudo tee file.txt

Вывод команды echo передается в качестве входных данных команде tee, которая повышает разрешения sudo и записывает текст в файл.

Читайте также:  Linux strace to file

Похожие записи:

Источник

Как добавить несколько строк в файл

Я пишу bash-скрипт для поиска файла, если он не существует, затем создайте его и добавьте к нему:

Host localhost ForwardAgent yes 

Так что «line then new line ‘tab’ then text» я думаю, что это чувствительный формат. Я знаю, что вы можете сделать это:

Но это кажется странным, так как его две строки. Есть ли способ добавить это в этом формате:

# possibility 1: echo "line 1" >> greetings.txt echo "line 2" >> greetings.txt # possibility 2: echo "line 1 line 2" >> greetings.txt # possibility 3: cat EOT >> greetings.txt line 1 line 2 EOT 

Если для записи в файл необходимы sudo (другие привилегии пользователя), используйте это:

# possibility 1: echo "line 1" | sudo tee -a greetings.txt > /dev/null # possibility 3: sudo tee -a greetings.txt > /dev/null EOT line 1 line 2 EOT 

@ ott— Вам не нужен настоящий подоболочек (то есть, вы можете сохранить один новый процесс), этого достаточно: < echo "line 1" ; echo "line 2"; >>>greetings.txt

printf '%s\n %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Или, если вам нужна буквальная вкладка (а не четыре пробела в вашем вопросе):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

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

echo -e "Hello \nWorld \n" >> greetings.txt

Другой подход заключается в использовании tee

tee -a ~/.ssh/config  END Host localhost ForwardAgent yes END 

Несколько строк выбора со tee страницы руководства пользователя:

Утилита tee копирует стандартный ввод в стандартный вывод, делая копию в ноль или более файлов.

-a — Добавляет вывод к файлам, а не перезаписывает их.

SED может добавить строку в конец файла следующим образом:

sed -i ‘$ a text to be inserted’ fileName.file
$ выбирает конец файла, a сообщает ему добавить, и после этого следует текст, который нужно вставить. Тогда конечно имя файла.

Есть ли у этого подхода какие-либо дополнительные преимущества по сравнению с другими решениями?
Да, этот подход имеет дополнительное преимущество, заключающееся в добавлении любых файлов, возвращаемых при поиске, например: find . -name «*.html» -exec sed -i ‘$ a ‘ <> \;

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

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

Это работает только с GNU sed . BSD sed вываливается с ошибкой: command a expects \ followed by text . Так что не используйте это для решения по сценарию; это может сломаться. (Или сделайте это правильно, так как необходимый синтаксис BSD совместим с POSIX и будет работать и на GNU sed .

Остальные ответы могут быть использованы find следующим образом : find . -name «*.txt» -exec sh -c ‘printf «%s\n\t%s\n» «Host localhost» «ForwardAgent yes» >> «$1″‘ sh <> «;» .

Это очень хорошее решение, так как оно не выполняет перенаправление потока ( > , >> ) и, следовательно, не страдает от таких проблем, как запуск sudo echo ‘something’ > /file . Для меня это вполне позволяет добавить строку в файл в LXD контейнере , как , что: lxc exec c sed — ‘$ a newline’ /myfile .

Он echo «a new line» >> foo.file не будет создавать новую строку, когда файл не является концом новой строки, но sed -i ‘$ a a new line’ foo.file будет делать это, поэтому sed лучше, особенно если вы хотите всегда добавлять новую строку в файл.

Я использовал sed, потому что его можно использовать с sudo. Например:

sudo sed -i '$ a text to be inserted' fileName.file 

альтернатива очень уродлива, как:

sudo bash -c "echo a text to be inserted >> fileName.file" 

и даже хуже, когда это делается с помощью ssh.

Почему этот ответ был отвергнут? Это выглядит как решение, которое мне нужно. Есть ли с этим проблемы? Если нет, я воспользуюсь им и одобряю.

Вы sed -i не принимаете расширение в качестве аргумента? В вашем примере могут быть неверные параметры.

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Я бы предпочел -e вариант с мыслью, так как он дает больше контроля:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

Можно cat >> out.txt добиться эмуляции с помощью Perl или Python для достижения того же эффекта. Perl:

perl -e 'open(fh,">>","./out.txt");while(<>);close(fh);'
python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Обратите внимание, что для Python вам придется нажать Ctrl + D дважды. См. Связанный вопрос на stackoverflow для получения дополнительной информации.

Источник

📷 Как добавить текст в конец файла в Linux

В этом уроке мы изучаем различные способы добавления текста в конец файла в Linux.

Вы можете добиться этого, используя несколько методов в Linux, но самый простой – перенаправить вывод команды на желаемое имя файла. Используя символ >>, вы можете вывести результат любой команды в текстовый файл.

Другие способы достижения этого – использование инструментов Linux, таких как tee, awk и sed.

Перенаправить вывод команды или данных в конец файла

Каждая операционная система на основе Unix имеет концепцию «места по умолчанию для вывода».

Каждый называет это «стандартный вывод» или «stdout», произносится как standard out.

Ваша оболочка (вероятно, bash или zsh) постоянно следит за местом вывода по умолчанию.

Когда ваша оболочка видит новый вывод, она выводит его на экран, чтобы вы могли его увидеть.

Мы можем перенаправить этот вывод в файл, используя оператор >>.

Процедура выглядит следующим образом:

Добавить текст в конец файла с помощью команды echo:

echo 'sample text line' >> filename.txt

Добавить вывод команды в конец файла:

Добавление строк в конец файла

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

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

$ echo "sample line" >> test.txt $ cat test.txt sample line $ echo "sample line 2" >> test.txt $ cat test.txt sample line sample line 2

Добавление результата вывода данных команды в конец файла

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

В этом примере мы будем использовать date для добавления текущей даты в файл, команда uname – которая выведет версию ядра используемой нами системы Linux, и, наконец, команда ls, которая выводит текущую структуру каталогов и список файлов.

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

$ date >> test.txt $ cat test.txt sample line sample line 2 Tue Jun 25 20:28:51 UTC 2019 $ uname -r >> test.txt $ cat test.txt sample line sample line 2 Tue Jun 25 20:28:51 UTC 2019 3.13.0-170-generic $ ls >> test.txt $ cat test.txt sample line sample line 2 Tue Jun 25 20:28:51 UTC 2019 3.13.0-170-generic test.txt

Альтернативные методы

Давайте посмотрим, как добавить что-либо в файл с помощью утилиты tee, awk и sed Linux.

Использование инструмента командной строки tee

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

Команда названа в честь Т-разветвителя, используемого в сантехнике.

Он прерывает вывод программы, так что вывод может быть отображен и сохранен в файле.

Использование инструмента командной строки awk

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

Awk в основном используется для сканирования и обработки шаблонов.

$ awk 'BEGIN< printf "another text line appended" >> "test.txt" >' vagrant@ubuntu-trusty-64:~$ cat test.txt another text line appended

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

Команда Sed в Linux расшифровывается как потоковый редактор (stream editor) и может выполнять множество функций с файлом, таких как поиск, поиск и замена, вставка или удаление.

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

$ sed -i '$a yet another text line' test.txt vagrant@ubuntu-trusty-64:~$ cat test.txt yet another text line

Добавить несколько строк в файл

Есть несколько способов добавить несколько строк в файл одновременно.

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

$ echo "line 1" >> result.txt $ echo "line 2" >> result.txt

Следующий вариант – ввести новую строку в терминале:

echo "line 1 line 2 line 3" >> result.txt

Другой способ – открыть файл и писать строки, пока вы не наберете EOT:

$ cat > result.txt line 1 line 2 EOT

Заключение

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

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

Дайте нам знать, какой метод для добавления в конец файла вы считаете лучшим в разделе комментариев.

Делить комментариями и добавляйте статьи в соц. сети, если они вам нравятся!

Источник

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