Daten mit Bash öffnen und in eine Textdatei schreiben?

247

Wie kann ich Daten unter Shell-Scripting unter Linux automatisch in eine Textdatei schreiben?

Ich konnte die Datei öffnen. Ich weiß jedoch nicht, wie ich Daten darauf schreiben soll.

Adnan
quelle

Antworten:

409
echo "some data for the file" >> fileName
Triton Man
quelle
7
Wie heißt dieser Operator? Ich würde gerne ein Handbuch dazu finden.
Vlad T.
96
Der Operator> leitet die Ausgabe in eine Datei um, die die Datei überschreibt, falls vorhanden. Das >> wird an eine vorhandene Datei angehängt.
Triton Man
4
Vielen Dank, hier ist der Link zur Wiki-Seite, falls jemand sie benötigt. En.wikipedia.org/wiki/…
Vlad T.
11
Wenn Sie dies mit Root-Rechten tun müssen, gehen Sie folgendermaßen vor:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Was passiert , wenn mein Text etwas wie ist dies und aus irgendeinem Grund kann ich nicht verwenden , curloder 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
cooles Feuer
quelle
1
Gute Einstellung für mehrzeilige Ausgabe.
Federico Zancan
7
Neulinge würden davon profitieren, genau zu wissen, was mit dieser Datei zu tun ist. Wie man es speichert, wie man es
Danny
13
Bitte erklären Sie, anstatt einfach einen Code aufzustellen. Es würde es für alle so viel hilfreicher machen - besonders für Neulinge.
Casper B. Hansen
2
In diesem Fall gehen Skripte mit Variablen wie $ some_var verloren. Wie kann es behoben werden?
ATrubka
60

Sie können die Ausgabe eines Befehls in eine Datei umleiten:

$ cat file > copy_file

oder anhängen

$ cat file >> copy_file

Wenn Sie direkt schreiben möchten, lautet der Befehl echo 'text'

$ echo 'Hello World' > file
ssedano
quelle
3
Wenn Sie Root-Erlaubnis benötigen: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(dank Lukaserats Kommentar oben)
Aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
Baetacos
quelle
38
Eine Erklärung Ihres Codes würde einen großen Beitrag dazu leisten, ihn für andere benutzerfreundlicher zu machen. Selbst Vokabeln wie "Hier dokumentieren" und "Umleitung" können Suchende auf andere Ressourcen verweisen.
Palpatim
2
Für so etwas ist eine Erklärung nicht so notwendig.
Bhargav Nanekalva
6
Eine Erklärung ist niemals erforderlich, wenn Sie die Antwort bereits kennen. Für mich ist der obige Code aufgrund fehlender Details nicht hilfreich.
Søren Ullidtz
1
Nach EOF - sollte kein Leerzeichen sein.
21рий Светлов
24

Ich weiß, dass dies eine verdammt alte Frage ist, aber da es im OP um Skripterstellung geht und Google mich hierher gebracht hat, sollte auch das Öffnen von Dateideskriptoren zum gleichzeitigen Lesen und Schreiben erwähnt werden.

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

Dann catdie Datei auf dem Terminal

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

Dieses Beispiel bewirkt, dass die Datei gedicht.txt zum Lesen und Schreiben in Dateideskriptor 3 geöffnet ist. Es zeigt auch, dass * nix-Boxen mehr fd's kennen als nur stdin, stdout und stderr (fd 0,1,2). Es hält tatsächlich viel. Normalerweise befindet sich die maximale Anzahl von Dateideskriptoren, die der Kernel zuweisen kann, in /proc/sys/file-maxoder /proc/sys/fs/file-maxaber die Verwendung eines fd über 9 ist gefährlich, da dies zu Konflikten mit den von der Shell intern verwendeten fd führen kann. Also mach dir keine Sorgen und benutze nur fds 0-9. Wenn Sie mehr als die 9 Dateideskriptoren in einem Bash-Skript benötigen, sollten Sie sowieso eine andere Sprache verwenden :)

Wie auch immer, fd's können auf viele interessante Arten verwendet werden.

tobi
quelle
14

Ich mag diese Antwort:

cat > FILE.txt <<EOF

info code info 
...
EOF

aber würde vorschlagen, cat >> FILE.txt << EOFwenn Sie nur etwas am Ende der Datei hinzufügen möchten, ohne zu löschen, was bereits vorhanden ist

So was:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
quelle
1
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft
9

Verschieben meines Kommentars als Antwort, wie von @lycono angefordert

Wenn Sie dies mit Root-Rechten tun müssen, gehen Sie folgendermaßen vor:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
quelle
6
Möglicherweise möchten Sie vermeiden, eine Root-Shell nur zum Drucken einer Zeichenfolge auszuführen. Versuchen Sie echo "some data for the file" | sudo tee -a fileName >/dev/null, nur teeals root auszuführen .
Tripleee
6

Für Umgebungen , in denen hier Dokumente nicht verfügbar sind ( Makefile, Dockerfileusw.) Sie häufig verwenden , können printffür eine einigermaßen lesbar und effiziente Lösung.

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
quelle
1
Ihr Kommentar oben Versuchen Sie, "einige Daten für die Datei" | wiederzugeben sudo tee -a Dateiname> / dev / null, um tee nur als root auszuführen. war wirklich nützlich!
Kojo
5

Ich dachte, es gäbe ein paar vollkommen gute Antworten, aber keine kurze Zusammenfassung aller Möglichkeiten; so:

Das Hauptprinzip hinter den meisten Antworten ist die Umleitung . Zwei sind wichtige Umleitungsoperatoren zum Schreiben in Dateien:

Ausgabe umleiten:

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

Umgeleitete Ausgabe anhängen

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

Hier Dokumente

Andere erwähnten, anstatt von einer festen Eingabequelle wie echo 'text', könnten Sie auch interaktiv über ein "Hier-Dokument" in Dateien schreiben, die auch im Link zum obigen Bash-Handbuch beschrieben sind. Diese Antworten, z

cat > FILE.txt <<EOF oder cat >> FILE.txt <<EOF

Verwenden Sie dieselben Umleitungsoperatoren, fügen Sie jedoch über "Hier Dokumente" eine weitere Ebene hinzu. In der obigen Syntax schreiben Sie über die Ausgabe von in die Datei FILE.txt cat. Das Schreiben erfolgt erst, nachdem der interaktiven Eingabe eine bestimmte Zeichenfolge zugewiesen wurde, in diesem Fall 'EOF'. Dies kann jedoch eine beliebige Zeichenfolge sein, z.

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

würde genauso gut funktionieren. Hier suchen Dokumente auch nach verschiedenen Trennzeichen und anderen interessanten Analysezeichen. Weitere Informationen hierzu finden Sie in den Dokumenten.

Hier Saiten

Ein bisschen verworren und eher eine Übung zum Verstehen der Umleitung und der Here Documents-Syntax, aber Sie können die Here Document-Stilsyntax mit Standard-Redirect-Operatoren kombinieren, um eine Here String zu werden:

Ausgabe der Katzeneingabe umleiten

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

Anhängen der umgeleiteten Ausgabe der Katzeneingabe

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

topher217
quelle
0

Kann hier auch document und vi verwenden, generiert das folgende Skript eine FILE.txt mit 3 Zeilen und variabler Interpolation

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

Dann hat die Datei 3 Zeilen wie unten. "i" dient zum Starten des vi-Einfügemodus und zum Schließen der Datei mit Esc und ZZ.

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

Das ist meine Antwort. $ cat file> copy_file

onoffon
quelle
1
Was ist Datei und Kopierdatei?
XPD