Открыть и записать данные в текстовый файл, используя 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
ssedano
источник
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 
baetacos
источник
38
Объяснение вашего кода будет иметь большое значение для того, чтобы сделать его более полезным для других. Даже выноски из словаря, такие как «здесь документ» и «перенаправление», могут указывать поисковикам на другие ресурсы.
Palpatim
2
Объяснение не так необходимо для чего-то подобного.
Бхаргав Нанекалва
6
Объяснение никогда не требуется, когда вы уже знаете ответ. Для меня приведенный выше код не помогает из-за отсутствия деталей.
Сёрен Уллидц
Можно также просто сделать, cat > FILE.txtзатем нажмите Ctrl + D, когда вы закончите .
Уолли
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'
lukaserat
источник
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
tripleee
источник
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'

topher217
источник
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
Субод Шарма
источник
0

это мой ответ $ cat file> copy_file

onoffon
источник
1
что такое файл и copy_file?
XPD