web-dev-qa-db-fra.com

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

Comment puis-je écrire des données dans un fichier texte automatiquement à l'aide de scripts Shell sous Linux?

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

188
Adnan
echo "some data for the file" >> fileName
317
Triton Man
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2
text3
text4
EOM
125
coolfire

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
50
ssedano
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
40
baetacos

Je sais que c’est une sacrée vieille question, mais comme le PO concerne les scripts, et pour le fait que Google me l’a amenée ici, il convient également de mentionner l’ouverture de descripteurs de fichiers pour la lecture et l’écriture.

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

Puis cat le fichier sur le terminal

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

Cet exemple montre que le fichier poem.txt est ouvert en lecture et en écriture sur le descripteur de fichier 3. Il indique également que * les boîtes nix connaissent davantage de fd que simplement stdin, stdout et stderr (fd 0,1,2). En fait, ça tient beaucoup. Le nombre maximal de descripteurs de fichier pouvant être alloués par le noyau se trouve généralement dans /proc/sys/file-max ou /proc/sys/fs/file-max, mais il est dangereux d'utiliser un fd supérieur à 9, car il pourrait entrer en conflit avec les fd utilisés par Shell en interne. Alors ne vous embêtez pas et utilisez uniquement les valeurs 0 à 9 de fd. Si vous avez besoin de plus de 9 descripteurs de fichier dans un script bash, vous devriez quand même utiliser un autre langage :)

Quoi qu'il en soit, les fd peuvent être utilisés de nombreuses manières intéressantes.

22
tobi

J'aime cette réponse:

cat > FILE.txt <<EOF

info code info 
...
EOF

mais suggérerait cat >> FILE.txt << EOF si 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
12
Marat

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

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

Sudo sh -c 'echo "some data for the file" >> fileName'
6
lukaserat

Pour les environnements où les documents sont indisponibles (Makefile, Dockerfile, etc.), vous pouvez souvent utiliser printf pour une 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
4
tripleee

Peut aussi utiliser ici document et vi, le script ci-dessous génère un fichier FILE.txt avec 3 lignes et une 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

Ensuite, le fichier aura 3 lignes comme ci-dessous. "i" consiste à démarrer le mode vi et à fermer le fichier avec Esc et ZZ.

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