Buka dan tulis data ke file teks menggunakan Bash?

247

Bagaimana saya bisa menulis data ke file teks secara otomatis dengan skrip shell di Linux?

Saya bisa membuka file. Namun, saya tidak tahu bagaimana cara menulis data.

Adnan
sumber

Jawaban:

409
echo "some data for the file" >> fileName
Manusia Triton
sumber
7
Apa nama operator ini? Saya ingin mencari manual tentang itu.
Vlad T.
96
operator> mengalihkan output ke file yang menimpa file jika ada. >> akan menambahkan ke file yang ada.
Triton Man
4
Terima kasih, ini tautan ke halaman wiki, kalau-kalau ada yang membutuhkannya en.wikipedia.org/wiki/…
Vlad T.
11
Jika Anda perlu melakukan ini dengan hak akses root, lakukan seperti ini:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Bagaimana jika teks saya adalah sesuatu seperti ini dan untuk alasan apa pun, saya tidak bisa menggunakan curlatau 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
keren
sumber
1
Nice mengambil output multiline.
Federico Zancan
8
Pemula akan mendapat manfaat dari mengetahui apa yang harus dilakukan dengan file ini. Bagaimana cara menyimpannya, bagaimana menjalankannya, dll.
Danny
14
Tolong jelaskan daripada hanya memasang sepotong kode. Itu akan membuatnya jauh lebih bermanfaat bagi semua orang - terutama pemula.
Casper B. Hansen
2
Dalam hal ini skrip dengan variabel seperti $ some_var tersesat. Bagaimana bisa diperbaiki?
ATrubka
60

Anda dapat mengarahkan output perintah ke file:

$ cat file > copy_file

atau menambahkannya

$ cat file >> copy_file

Jika Anda ingin menulis secara langsung, perintahnya adalah echo 'text'

$ echo 'Hello World' > file
ssedano
sumber
3
Jika Anda memerlukan izin root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(terima kasih atas komentar lukaserat di atas)
aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
baetacos
sumber
38
Penjelasan tentang kode Anda akan sangat bermanfaat agar lebih bermanfaat bagi orang lain. Bahkan info kosa kata seperti "dokumen di sini" dan "pengalihan" dapat mengarahkan pencari ke sumber lain.
Palpatim
2
Penjelasan tidak begitu diperlukan untuk hal seperti ini.
Bhargav Nanekalva
6
Penjelasan tidak pernah diperlukan ketika Anda sudah tahu jawabannya. Bagi saya kode di atas tidak membantu karena kurang detail.
Søren Ullidtz
1
Setelah EOF - seharusnya tidak ada spasi.
Юрий Светлов
24

Saya tahu ini adalah pertanyaan lama, tetapi karena OP adalah tentang scripting, dan fakta bahwa google membawa saya ke sini, membuka file deskriptor untuk membaca dan menulis pada saat yang sama juga harus disebutkan.

#!/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>&-

Kemudian catfile di terminal

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

Contoh ini menyebabkan file poem.txt terbuka untuk dibaca dan ditulis pada deskriptor file 3. Ini juga menunjukkan bahwa * kotak nix tahu lebih banyak fd daripada hanya stdin, stdout dan stderr (fd 0,1,2). Ini benar-benar memegang banyak hal. Biasanya jumlah maksimum deskriptor file yang dapat dialokasikan oleh kernel dapat ditemukan di /proc/sys/file-maxatau /proc/sys/fs/file-maxtetapi menggunakan fd di atas 9 berbahaya karena dapat bertentangan dengan fd yang digunakan oleh shell secara internal. Jadi jangan repot-repot dan hanya menggunakan fd 0-9. Jika Anda membutuhkan lebih banyak 9 deskriptor file dalam skrip bash, Anda harus menggunakan bahasa yang berbeda pula :)

Bagaimanapun, fd dapat digunakan dalam banyak cara menarik.

tobi
sumber
14

Saya suka jawaban ini:

cat > FILE.txt <<EOF

info code info 
...
EOF

tetapi akan menyarankan cat >> FILE.txt << EOFjika Anda ingin menambahkan sesuatu ke akhir file tanpa memusnahkan apa yang sudah ada

Seperti ini:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
sumber
1
Tambahkan beberapa penjelasan dengan jawaban untuk bagaimana jawaban ini membantu OP dalam memperbaiki masalah saat ini
ρяσѕρєя K
9

Memindahkan komentar saya sebagai jawaban, seperti yang diminta oleh @lycono

Jika Anda perlu melakukan ini dengan hak akses root, lakukan seperti ini:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
sumber
6
Anda mungkin ingin menghindari menjalankan shell root hanya untuk mencetak string. Usahakan echo "some data for the file" | sudo tee -a fileName >/dev/nullhanya berjalan teesebagai root.
tripleee
6

Untuk lingkungan di mana di sini dokumen tidak tersedia (Makefile , Dockerfile, dll) Anda dapat sering menggunakan printfuntuk solusi cukup terbaca dan efisien.

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
sumber
1
Komentar Anda di atas Coba gema "beberapa data untuk file" | sudo tee -a fileName> / dev / null untuk hanya menjalankan tee sebagai root. sangat berguna!
Kojo
5

Saya pikir ada beberapa jawaban yang sangat bagus, tetapi tidak ada ringkasan singkat dari semua kemungkinan; jadi:

Prinsip utama di balik sebagian besar jawaban di sini adalah pengalihan . Dua operator pengalihan penting untuk menulis ke file:

Mengarahkan Output:

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

Menambah Output yang Diarahkan

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

Di sini Dokumen

Lainnya menyebutkan, daripada dari sumber input tetap seperti echo 'text' , Anda juga bisa secara interaktif menulis ke file melalui "Dokumen Di Sini", yang juga dirinci dalam tautan ke bash manual di atas. Jawaban itu, mis

cat > FILE.txt <<EOF atau cat >> FILE.txt <<EOF

memanfaatkan operator pengalihan yang sama, tetapi tambahkan lapisan lain melalui "Dokumen Di Sini". Dalam sintaks di atas, Anda menulis ke FILE.txt melalui output dari cat. Penulisan hanya terjadi setelah input interaktif diberikan beberapa string tertentu, dalam hal ini 'EOF', tetapi ini bisa berupa string apa pun, misalnya:

cat > FILE.txt <<'StopEverything' atau cat >> FILE.txt <<'StopEverything'

akan bekerja dengan baik. Di sini Documents juga mencari berbagai pembatas dan karakter parsing yang menarik lainnya, jadi lihat dokumen untuk info lebih lanjut tentang itu.

Di sini Strings

Agak berbelit-belit, dan lebih merupakan latihan dalam memahami sintaks pengalihan dan Here Documents, tetapi Anda bisa menggabungkan sintaksis gaya dokumen sini dengan operator pengarah standar untuk menjadi String di sini:

Mengarahkan Output dari Input kucing

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

Menambahkan Output yang Diarahkan dari Input kucing

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

topher217
sumber
0

Dapat juga menggunakan dokumen dan vi di sini, skrip di bawah ini menghasilkan FILE.txt dengan 3 baris dan interpolasi variabel

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

Maka file akan memiliki 3 baris seperti di bawah ini. "i" adalah untuk memulai mode memasukkan vi dan juga untuk menutup file dengan Esc dan ZZ.

#This is my var in text file
var = Test
#Thats end of text file
Subodh Sharma
sumber
0

ini jawaban saya $ cat file> copy_file

onoffon
sumber
1
apa itu file dan copy_file?
XPD