Apri e scrivi dati su file di testo usando Bash?


247

Come posso scrivere automaticamente i dati in un file di testo tramite shell scripting in Linux?

Sono stato in grado di aprire il file. Tuttavia, non so come scrivere dati su di esso.

Risposte:


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

7
Qual è il nome di questo operatore? Vorrei trovare un manuale a riguardo.
Vlad T.

96
l'operatore> reindirizza l'output su un file sovrascrivendo il file se ne esiste uno. >> verrà aggiunto a un file esistente.
Triton Man,

4
Grazie, ecco il link alla pagina wiki, nel caso qualcuno ne avesse bisogno en.wikipedia.org/wiki/…
Vlad T.

11
Se hai bisogno di farlo con i privilegi di root, fallo in questo modo:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
Che cosa succede se il mio testo è simile a questo e per qualsiasi motivo, non posso usare curlo 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
Bella interpretazione dell'output multilinea.
Federico Zancan,

8
I neofiti trarrebbero beneficio dal sapere esattamente cosa fare con questo file. Come salvarlo, come eseguirlo, ecc.
Danny

14
Spiega piuttosto che semplicemente inserire un pezzo di codice. Lo renderebbe molto più utile a tutti, specialmente ai neofiti.
Casper B. Hansen,

2
In questo caso, gli script con variabili come $ some_var vanno persi. Come può essere aggiustato?
ATrubka,


60

Puoi reindirizzare l'output di un comando su un file:

$ cat file > copy_file

o aggiungere ad esso

$ cat file >> copy_file

Se vuoi scrivere direttamente il comando è echo 'text'

$ echo 'Hello World' > file

3
Se hai bisogno del permesso di root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(grazie al commento di lukaserat sopra)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
Una spiegazione del tuo codice farebbe molto per renderlo più utilizzabile dagli altri. Anche i callout del vocabolario come "qui documento" e "reindirizzamento" possono indirizzare gli utenti verso altre risorse.
Palpatim,

2
La spiegazione non è così necessaria per qualcosa di simile.
Bhargav Nanekalva,

6
La spiegazione non è mai necessaria quando si conosce già la risposta. Per me il codice sopra non è utile a causa della mancanza di dettagli.
Søren Ullidtz il


1
Dopo EOF - non dovrebbero esserci spazi.
Юрий Светлов

24

So che questa è una dannata domanda, ma dato che l'OP riguarda lo scripting, e per il fatto che google mi ha portato qui, è opportuno menzionare anche l'apertura di descrittori di file per leggere e scrivere contemporaneamente.

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

Quindi catil file sul terminale

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

Questo esempio fa sì che il file poem.txt sia aperto per la lettura e la scrittura sul descrittore di file 3. Mostra anche che le caselle * nix conoscono più fd quindi solo stdin, stdout e stderr (fd 0,1,2). In realtà tiene molto. Di solito il numero massimo di descrittori di file che il kernel può allocare può essere trovato /proc/sys/file-maxo /proc/sys/fs/file-maxma usare qualsiasi fd sopra 9 è pericoloso in quanto potrebbe entrare in conflitto con fd usato dalla shell internamente. Quindi non preoccuparti e usa solo fd's 0-9. Se hai bisogno di più di 9 descrittori di file in uno script bash, dovresti comunque usare una lingua diversa :)

Ad ogni modo, i FD possono essere usati in molti modi interessanti.


14

Mi piace questa risposta:

cat > FILE.txt <<EOF

info code info 
...
EOF

ma suggerirei cat >> FILE.txt << EOFse vuoi semplicemente aggiungere qualcosa alla fine del file senza cancellare ciò che esiste già

Come questo:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
Aggiungi una spiegazione con la risposta su come questa risposta aiuti OP nel risolvere il problema attuale
ρяσѕρєя K

9

Sposta il mio commento come risposta, come richiesto da @lycono

Se devi farlo con i privilegi di root, fallo in questo modo:

sudo sh -c 'echo "some data for the file" >> fileName'

6
Potresti voler evitare di eseguire una shell di root solo per stampare una stringa. Prova echo "some data for the file" | sudo tee -a fileName >/dev/nulla eseguire solo teecome root.
triplo

6

Per gli ambienti in cui qui i documenti non sono disponibili ( Makefile, Dockerfile, ecc) spesso è possibile utilizzare printfuna soluzione ragionevolmente leggibile ed efficiente.

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
Il tuo commento sopra Prova echo "alcuni dati per il file" | sudo tee -a fileName> / dev / null per eseguire solo tee come root. è stato davvero utile!
Kojo,

5

Ho pensato che ci fossero alcune risposte perfettamente valide, ma nessun riassunto conciso di tutte le possibilità; in tal modo:

Il principale principale dietro la maggior parte delle risposte qui è il reindirizzamento . Due sono importanti operatori di reindirizzamento per la scrittura su file:

Reindirizzamento dell'uscita:

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

Aggiunta dell'output reindirizzato

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

Qui i documenti

Altri citati, piuttosto che da una fonte di input fissa come echo 'text', si potrebbe anche scrivere interattivamente su file tramite un "Here Document", che sono anche dettagliati nel link al manuale di bash sopra. Quelle risposte, ad es

cat > FILE.txt <<EOF o cat >> FILE.txt <<EOF

utilizzare gli stessi operatori di reindirizzamento, ma aggiungere un altro livello tramite "Here Documents". Nella sintassi sopra, scrivi su FILE.txt tramite l'output di cat. La scrittura ha luogo solo dopo che è stata assegnata una stringa specifica all'ingresso interattivo, in questo caso 'EOF', ma potrebbe trattarsi di qualsiasi stringa, ad esempio:

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

funzionerebbe altrettanto bene. Qui i documenti cercano anche vari delimitatori e altri interessanti personaggi di analisi, quindi dai un'occhiata ai documenti per ulteriori informazioni al riguardo.

Qui stringhe

Un po 'contorto, e più di un esercizio per comprendere sia il reindirizzamento che la sintassi Here Documents, ma potresti combinare la sintassi in stile Here Document con operatori di reindirizzamento standard per diventare una stringa Here:

Reindirizzamento dell'uscita dell'ingresso cat

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

Aggiunta dell'output reindirizzato dell'input cat

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


0

Puoi anche usare qui document e vi, lo script seguente genera un FILE.txt con 3 righe e interpolazione variabile

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

Quindi il file avrà 3 righe come di seguito. "i" è per avviare la modalità di inserimento vi e allo stesso modo per chiudere il file con Esc e ZZ.

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

0

questa è la mia risposta $ cat file> copy_file


1
che cos'è file e copy_file?
XPD,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.