Ouvrir et écrire des données dans un fichier texte en utilisant Bash?

247

Comment puis-je écrire des données dans un fichier texte automatiquement par script shell sous Linux?

J'ai pu ouvrir le fichier. Cependant, je ne sais pas comment y écrire des données.

Adnan
la source

Réponses:

410
echo "some data for the file" >> fileName
Triton Man
la source
7
Quel est le nom de cet opérateur? Je voudrais trouver un manuel à ce sujet.
Vlad T.15
96
l'opérateur> redirige la sortie vers un fichier écrasant le fichier s'il en existe un. Le >> s'ajoutera à un fichier existant.
Triton Man
4
Merci, voici le lien vers la page wiki, au cas où quelqu'un en aurait besoin en.wikipedia.org/wiki/…
Vlad T.
11
Si vous devez le faire avec des privilèges root, faites-le de cette façon:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Que faire si mon texte est quelque chose comme ça et pour une raison quelconque, je ne peux pas utiliser curlou 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
feu frais
la source
1
Belle prise sur la sortie multiligne.
Federico Zancan
8
Les débutants gagneraient à savoir exactement quoi faire avec ce fichier. Comment l'enregistrer, comment l'exécuter, etc.
Danny
14
Veuillez expliquer plutôt que de simplement mettre en place un morceau de code. Cela le rendrait beaucoup plus utile à tout le monde - en particulier aux débutants.
Casper B. Hansen
2
Dans ce cas, les scripts avec des variables comme $ some_var se perdent. Comment peut-il être corrigé?
ATrubka
60

Vous pouvez rediriger la sortie d'une commande vers un fichier:

$ cat file > copy_file

ou y ajouter

$ cat file >> copy_file

Si vous voulez écrire directement, la commande est echo 'text'

$ echo 'Hello World' > file
ssedano
la source
3
Si vous avez besoin d'une autorisation root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(grâce au commentaire de lukaserat ci-dessus)
aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
baetacos
la source
38
Une explication de votre code contribuerait grandement à le rendre plus utilisable par les autres. Même les légendes de vocabulaire comme «ici document» et «redirection» peuvent diriger les chercheurs vers d'autres ressources.
Palpatim
2
L'explication n'est pas si nécessaire pour quelque chose comme ça.
Bhargav Nanekalva
6
L'explication n'est jamais nécessaire lorsque vous connaissez déjà la réponse. Pour moi, le code ci-dessus n'est pas utile en raison du manque de détails.
Søren Ullidtz
1
Après l'EOF - il ne devrait y avoir aucun espace.
Юрий Светлов
24

Je sais que c'est une sacrée vieille question, mais comme l'OP concerne les scripts, et pour le fait que Google m'a amené ici, l'ouverture de descripteurs de fichiers pour la lecture et l'écriture en même temps doit également être mentionnée.

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

Ensuite, catle fichier sur le terminal

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

Cet exemple entraîne l'ouverture du fichier poem.txt pour la lecture et l'écriture sur le descripteur de fichier 3. Il montre également que les boîtes * nix connaissent plus de fd que stdin, stdout et stderr (fd 0,1,2). Cela tient vraiment beaucoup. Habituellement, le nombre maximum de descripteurs de fichiers que le noyau peut allouer peut être trouvé dans /proc/sys/file-maxou /proc/sys/fs/file-maxmais l'utilisation de tout fd supérieur à 9 est dangereuse car elle pourrait entrer en conflit avec les fd utilisés par le shell en interne. Alors ne vous embêtez pas et utilisez uniquement les 0-9 de fd. Si vous avez besoin de plus de 9 descripteurs de fichiers dans un script bash, vous devez quand même utiliser une langue différente :)

Quoi qu'il en soit, les fd peuvent être utilisés de nombreuses façons intéressantes.

tobi
la source
14

J'aime cette réponse:

cat > FILE.txt <<EOF

info code info 
...
EOF

mais suggérerais cat >> FILE.txt << EOFsi vous voulez simplement ajouter quelque chose à la fin du fichier sans effacer ce qui existe déjà

Comme ça:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
la source
1
Ajoutez une explication avec la réponse pour savoir comment cette réponse aide OP à résoudre le problème actuel
ρяσѕρєя K
9

Déplacer mon commentaire comme réponse, comme demandé par @lycono

Si vous devez le faire avec des privilèges root, procédez comme suit:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
la source
6
Vous voudrez peut-être éviter d'exécuter un shell racine juste pour imprimer une chaîne. Essayez echo "some data for the file" | sudo tee -a fileName >/dev/nulld'exécuter uniquement en teetant que root.
tripleee
6

Pour les environnements où les documents ne sont pas disponibles ici ( Makefile, Dockerfile, etc.) , vous pouvez souvent utiliser printfune solution raisonnablement lisible et efficace.

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
la source
1
Votre commentaire ci-dessus Essayez d'écho "quelques données pour le fichier" | sudo tee -a fileName> / dev / null pour exécuter uniquement tee en tant que root. était vraiment utile!
Kojo
5

J'ai pensé qu'il y avait quelques réponses parfaitement fines, mais aucun résumé concis de toutes les possibilités; Donc:

Le principal principe derrière la plupart des réponses ici est la redirection . Deux sont des opérateurs de redirection importants pour l'écriture dans des fichiers:

Redirection de la sortie:

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

Ajout d'une sortie redirigée

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

Ici Documents

D'autres ont mentionné, plutôt que d'une source d'entrée fixe comme echo 'text', vous pouvez également écrire de manière interactive dans des fichiers via un "document ici", qui sont également détaillés dans le lien vers le manuel bash ci-dessus. Ces réponses, par exemple

cat > FILE.txt <<EOF ou cat >> FILE.txt <<EOF

utilisez les mêmes opérateurs de redirection, mais ajoutez une autre couche via "Here Documents". Dans la syntaxe ci-dessus, vous écrivez dans le FILE.txt via la sortie de cat. L'écriture n'a lieu qu'après que l'entrée interactive a reçu une chaîne spécifique, dans ce cas 'EOF', mais cela peut être n'importe quelle chaîne, par exemple:

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

fonctionnerait tout aussi bien. Ici, les documents recherchent également divers délimiteurs et autres caractères d'analyse intéressants, alors consultez les documents pour plus d'informations à ce sujet.

Ici les cordes

Un peu compliqué, et plus d'un exercice pour comprendre à la fois la redirection et la syntaxe Here Documents, mais vous pouvez combiner la syntaxe de style Here Document avec les opérateurs de redirection standard pour devenir une chaîne Here:

Redirection de la sortie de l'entrée cat

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

Ajout de la sortie redirigée de l'entrée cat

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

topher217
la source
0

Peut également utiliser ici le document et vi, le script ci-dessous génère un FILE.txt avec 3 lignes et interpolation variable

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

Le fichier aura alors 3 lignes comme ci-dessous. "i" consiste à démarrer le mode d'insertion vi et de même à fermer le fichier avec Esc et ZZ.

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

c'est ma réponse. $ cat file> copy_file

onoffon
la source
1
qu'est-ce que file et copy_file?
XPD