Відкрити та записати дані в текстовий файл за допомогою Bash?


247

Як я можу автоматично записувати дані в текстовий файл за допомогою сценарію оболонки в Linux?

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

Відповіді:


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

7
Як звати цього оператора? Я хотів би знайти посібник з цього приводу.
Влад Т.

96
Оператор> перенаправляє висновок у файл, що перезаписує файл, якщо такий існує. >> додається до вже наявного файлу.
Людина Тритон

4
Дякую, ось посилання на сторінку wiki, якщо комусь це знадобиться 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
Пояснення вашого коду пройде довгий шлях до того, щоб зробити його більш корисним для інших. Навіть описи лексики на кшталт "тут документ" та "перенаправлення" можуть вказувати шукачів на інші ресурси.
Палпатим

2
Пояснення не так необхідне для чогось подібного.
Бхаргав Нанекальва

6
Пояснення ніколи не потрібно, коли ви вже знаєте відповідь. Для мене вищевказаний код не корисний через відсутність деталей.
Søren Ullidtz

Можна також просто зробити, cat > FILE.txtтоді натисніть ctrl + D, коли закінчите .
wally

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 0-9. Якщо вам потрібно більше 9 дескрипторів файлів у скрипті bash, ви все одно повинні використовувати іншу мову :)

У будь-якому випадку, fd's можна використовувати в багатьох цікавих способах.


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запустити лише teeroot.
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 -файлName> / dev / null, щоб запустити tee лише як 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:

Перенаправлення виводу коту

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

Додавання перенаправленого виводу коту

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


0

Тут також можна використовувати документ та 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.