Открыть и записать данные в текстовый файл, используя Bash?


247

Как я могу записать данные в текстовый файл автоматически с помощью сценариев оболочки в Linux?

Я был в состоянии открыть файл. Однако я не знаю, как записать в него данные.

Ответы:


410
echo "some data for the file" >> fileName

7
Как называется этот оператор? Я хотел бы найти руководство по этому поводу.
Влад Т.

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

4
Спасибо, вот ссылка на вики-страницу, на случай, если она кому-нибудь понадобится en.wikipedia.org/wiki/…
Влад Т.

11
Если вам нужно сделать это с правами root, сделайте это так:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
Что если мой текст похож на этот и по какой-либо причине я не могу использовать curlили wget?
Asedsami

145
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
 EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4 
EOM

1
Хороший взгляд на многострочный вывод.
Федерико Занкан

8
Новичкам будет полезно знать, что делать с этим файлом. Как его сохранить, как его запустить и т. Д.
Дэнни

14
Пожалуйста, объясните, а не просто вставьте кусок кода. Это сделало бы это намного более полезным для всех - особенно новичков.
Каспер Б. Хансен

2
В этом случае скрипты с переменными типа $ some_var теряются. Как это можно исправить?
ATrubka


60

Вы можете перенаправить вывод команды в файл:

$ cat file > copy_file

или добавить к нему

$ cat file >> copy_file

Если вы хотите написать непосредственно команду echo 'text'

$ echo 'Hello World' > file

3
Если вам нужно разрешение root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(спасибо комментарию lukaserat выше)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
Объяснение вашего кода будет иметь большое значение для того, чтобы сделать его более полезным для других. Даже выноски из словаря, такие как «здесь документ» и «перенаправление», могут указывать поисковикам на другие ресурсы.
Palpatim

2
Объяснение не так необходимо для чего-то подобного.
Бхаргав Нанекалва

6
Объяснение никогда не требуется, когда вы уже знаете ответ. Для меня приведенный выше код не помогает из-за отсутствия деталей.
Сёрен Уллидц


1
После EOF - не должно быть пробелов.
Юрий Светлов

24

Я знаю, что это чертовски старый вопрос, но поскольку ОП касается сценариев и того факта, что Google привел меня сюда, следует также упомянуть открытие файловых дескрипторов для чтения и записи одновременно.

#!/bin/bash

# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt

    # Let's print some text to fd 3
    echo "Roses are red" >&3
    echo "Violets are blue" >&3
    echo "Poems are cute" >&3
    echo "And so are you" >&3

# Close fd 3
exec 3>&-

Тогда catфайл на терминале

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

В этом примере файл poem.txt открывается для чтения и записи в файловом дескрипторе 3. Он также показывает, что * nix-окна знают больше fd, чем просто stdin, stdout и stderr (fd 0,1,2). Это на самом деле много держит. Обычно максимальное количество файловых дескрипторов, которое может выделить ядро, может быть найдено /proc/sys/file-maxили, /proc/sys/fs/file-maxно использование любого fd выше 9 опасно, поскольку может конфликтовать с fd, используемым оболочкой внутри. Так что не беспокойтесь и используйте только fd's 0-9. Если вам нужно больше 9 файловых дескрипторов в bash-скрипте, вы все равно должны использовать другой язык :)

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


14

Мне нравится этот ответ:

cat > FILE.txt <<EOF

info code info 
...
EOF

но предложил бы, cat >> FILE.txt << EOFесли вы хотите просто добавить что-то в конец файла, не стирая то, что уже существует

Как это:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
Добавьте некоторое объяснение с ответом о том, как этот ответ помогает ОП в исправлении текущей проблемы
ρяσѕρєя K

9

Перемещение моего комментария в качестве ответа в соответствии с просьбой @lycono

Если вам нужно сделать это с правами root, сделайте это так:

sudo sh -c 'echo "some data for the file" >> fileName'

6
Возможно, вы захотите избежать запуска корневой оболочки только для печати строки. Попробуйте echo "some data for the file" | sudo tee -a fileName >/dev/nullзапустить только teeкак root.
tripleee

6

В средах, где документы здесь недоступны ( Makefileи Dockerfileт. Д.), Вы часто можете использовать их printfдля разумного и эффективного решения.

printf '%s\n' '#!/bin/sh' '# Second line' \
    '# Third line' \
    '# Conveniently mix single and double quotes, too' \
    "# Generated $(date)" \
    '# ^ the date command executes when the file is generated' \
    'for file in *; do' \
    '    echo "Found $file"' \
    'done' >outputfile

1
Ваш комментарий выше Попробуйте повторить "некоторые данные для файла" | sudo tee -a fileName> / dev / null для запуска только в качестве пользователя root. было действительно полезно!
Коджо

5

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

Основным принципом, лежащим в основе большинства ответов здесь, является перенаправление . Два важных оператора перенаправления для записи в файлы:

Перенаправление вывода:

echo 'text to completely overwrite contents of myfile' > myfile

Добавление перенаправленного вывода

echo 'text to add to end of myfile' >> myfile

Здесь документы

Другие упомянутые, а не из фиксированного источника ввода, как echo 'text' , вы также могли бы в интерактивном режиме записывать в файлы через «Здесь документ», которые также подробно описаны в ссылке на руководство bash выше. Эти ответы, например,

cat > FILE.txt <<EOF или cat >> FILE.txt <<EOF

использовать те же операторы перенаправления, но добавить еще один слой через «Здесь документы». В приведенном выше синтаксисе вы пишете в FILE.txt через выводcat . Запись происходит только после того, как для интерактивного ввода задана какая-то конкретная строка, в данном случае «EOF», но это может быть любая строка, например:

cat > FILE.txt <<'StopEverything' или cat >> FILE.txt <<'StopEverything'

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

Здесь Строки

Немного запутанный, и больше упражнений в понимании как перенаправления, так и синтаксиса Here Documents, но вы можете объединить синтаксис стиля Here Document со стандартными операторами перенаправления, чтобы стать Here String:

Перенаправление вывода ввода cat

cat > myfile <<<'text to completely overwrite contents of myfile'

Добавление перенаправленного вывода ввода cat

cat >> myfile <<<'text to completely overwrite contents of myfile'


0

Также можно использовать здесь document и vi, приведенный ниже скрипт генерирует FILE.txt с 3 строками и переменной интерполяцией

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

Тогда файл будет иметь 3 строки, как показано ниже. «i» - запустить режим вставки vi и аналогичным образом закрыть файл с помощью Esc и ZZ.

#This is my var in text file
var = Test
#Thats end of text file

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.