- Bash: Запись в файл
- Запись в файл с помощью операторов перенаправления вывода
- Запись в файл с помощью команды tee
- Похожие записи:
- Как добавить несколько строк в файл
- 📷 Как добавить текст в конец файла в Linux
- Перенаправить вывод команды или данных в конец файла
- Добавление строк в конец файла
- Добавление результата вывода данных команды в конец файла
- Альтернативные методы
- Использование инструмента командной строки tee
- Использование инструмента командной строки awk
- Использование инструмента командной строки sed
- Добавить несколько строк в файл
- Заключение
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 и записывает текст в файл.
Похожие записи:
Как добавить несколько строк в файл
Я пишу 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