Open en schrijf data naar tekstbestand met Bash?

Hoe kan ik automatisch gegevens naar een tekstbestand schrijven door shellscripting in Linux?

Ik heb het bestand kunnen openen. Ik weet echter niet hoe ik er gegevens naar moet schrijven.


Antwoord 1, autoriteit 100%

Het korte antwoord:

echo "some data for the file" >> fileName

Echter, echogaat niet over end-of-line-tekens (EOF’s) in een ideale manier. Dus, als je meer dan één regel wilt toevoegen, doe het dan met printf:

printf "some data for the file\nAnd a new line" >> fileName

De operators >>en >zijn erg handig voor het omleiden van de uitvoer van commando’s, ze werken met meerdere andere bash-commando’s.


Antwoord 2, autoriteit 32%

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

Antwoord 3, autoriteit 14%

U kunt de uitvoer van een opdracht omleiden naar een bestand:

$ cat file > copy_file

of eraan toevoegen

$ cat file >> copy_file

Als je direct wilt schrijven, is het commando echo 'text'

$ echo 'Hello World' > file

Antwoord 4, autoriteit 11%

#!/bin/bash
cat > FILE.txt <<EOF
info code info 
info code info
info code info
EOF 

Antwoord 5, autoriteit 6%

Ik weet dat dit een verdomd oude vraag is, maar aangezien de OP over scripting gaat, en vanwege het feit dat Google me hier heeft gebracht, moet ook het openen van bestandsdescriptors voor lezen en schrijven tegelijk worden vermeld.

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

Vervolgens cathet bestand op terminal

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

Dit voorbeeld zorgt ervoor dat het bestand poem.txt open staat voor lezen en schrijven in bestandsdescriptor 3. Het laat ook zien dat *nix-boxen meer fd’s kennen dan alleen stdin, stdout en stderr (fd 0,1,2). Het houdt eigenlijk veel in. Gewoonlijk is het maximale aantal bestandsdescriptors dat de kernel kan toewijzen te vinden in /proc/sys/file-maxof /proc/sys/fs/file-maxmaar met elke fd boven 9 is gevaarlijk omdat het in conflict kan komen met fd’s die intern door de shell worden gebruikt. Dus doe geen moeite en gebruik alleen fd’s 0-9. Als je meer van de 9 bestandsdescriptors in een bash-script nodig hebt, moet je toch een andere taal gebruiken 🙂

Hoe dan ook, fd’s kunnen op veel interessante manieren worden gebruikt.


Antwoord 6, autoriteit 3%

Ik vind dit antwoord leuk:

cat > FILE.txt <<EOF
info code info 
...
EOF

maar zou cat >> FILE.txt << EOFals je gewoon iets aan het einde van het bestand wilt toevoegen zonder weg te vagen wat al bestaat

Zoals dit:

cat >> FILE.txt <<EOF
info code info 
...
EOF

Antwoord 7, autoriteit 2%

Mijn reactie verplaatsen als antwoord, zoals gevraagd door @lycono

Als je dit met root-rechten moet doen, doe het dan op deze manier:

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

Antwoord 8, autoriteit 2%

Voor omgevingen waar hier geen documenten beschikbaar zijn (Makefile, Dockerfile, etc) kun je vaak printfgebruiken voor een redelijk leesbare en efficiënte oplossing .

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

Antwoord 9, autoriteit 2%

Ik dacht dat er een paar prima antwoorden waren, maar geen beknopte samenvatting van alle mogelijkheden; dus:

Het belangrijkste principe achter de meeste antwoorden hier is omleiding. Twee zijn belangrijke omleidingsoperatoren voor het schrijven naar bestanden:

Uitvoer omleiden:

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

Omgeleide uitvoer toevoegen

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

Hier documenten

Andere genoemde, in plaats van vanuit een vaste invoerbron zoals echo 'text', kunt u ook interactief naar bestanden schrijven via een “Here Document”, die ook worden beschreven in de link naar de bash handleiding hierboven. Die antwoorden, b.v.

cat > FILE.txt <<EOFof cat >> FILE.txt <<EOF

maak gebruik van dezelfde omleidingsoperatoren, maar voeg een andere laag toe via “Here Documents”. In de bovenstaande syntaxis schrijft u naar de FILE.txt via de uitvoer van cat. Het schrijven vindt pas plaats nadat de interactieve invoer een specifieke tekenreeks heeft gekregen, in dit geval ‘EOF’, maar dit kan elke willekeurige tekenreeks zijn, bijvoorbeeld:

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

zou net zo goed werken. Hier zoeken Documenten ook naar verschillende scheidingstekens en andere interessante parseertekens, dus bekijk de documenten voor meer informatie hierover.

Hier strings

Een beetje ingewikkeld, en meer een oefening in het begrijpen van zowel de omleiding als de Here Documents-syntaxis, maar u zou de Here Document-stijlsyntaxis kunnen combineren met standaard omleidingsoperatoren om een Here-string te worden:

Uitvoer van kat-invoer omleiden

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

Omgeleide uitvoer van cat-invoer toevoegen

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


Antwoord 10

Kan hier ook document en vi gebruiken, het onderstaande script genereert een FILE.txt met 3 regels en variabele interpolatie

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

Het bestand heeft dan 3 regels zoals hieronder. “i” is om de vi-invoegmodus te starten en op dezelfde manier het bestand te sluiten met Esc en ZZ.

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

Antwoord 11

Als u variabelen gebruikt, kunt u

first_var="Hello"
second_var="How are you"

Als je beide strings wilt samenvoegen en naar een bestand wilt schrijven, gebruik dan hieronder

echo "${first_var} - ${second_var}" > ./file_name.txt

Uw bestandsnaam.txt-inhoud is “Hallo – Hoe gaat het”


Antwoord 12

dit is mijn antwoord.
$ cat-bestand > copy_file

Other episodes