Czy otwierać i zapisywać dane do pliku tekstowego za pomocą Bash?

247

Jak mogę automatycznie zapisywać dane do pliku tekstowego za pomocą skryptów powłoki w systemie Linux?

Byłem w stanie otworzyć plik. Nie wiem jednak, jak zapisać na nim dane.

Adnan
źródło

Odpowiedzi:

410
echo "some data for the file" >> fileName
Triton Man
źródło
7
Jak nazywa się ten operator? Chciałbym znaleźć instrukcję na ten temat.
Vlad T.
96
operator> przekierowuje dane wyjściowe do pliku zastępującego plik, jeśli taki istnieje. >> dołączy do istniejącego pliku.
Triton Man
4
Dziękuję, tutaj jest link do strony wiki, na wypadek, gdyby ktoś tego potrzebował pl.wikipedia.org/wiki/...
Vlad T.
11
Jeśli musisz to zrobić z uprawnieniami roota, zrób to w następujący sposób:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Co jeśli mój tekst jest podobny do tego i z jakiegoś powodu nie mogę użyć curllub 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
coolfire
źródło
1
Ładne podejście do produkcji wieloliniowej.
Federico Zancan,
8
Nowi gracze skorzystaliby z dokładnej wiedzy, co zrobić z tym plikiem. Jak go zapisać, jak go uruchomić itp.
Danny
14
Proszę wyjaśnić, a nie po prostu wstawić kawałek kodu. Dzięki temu byłby o wiele bardziej pomocny dla wszystkich - zwłaszcza dla początkujących.
Casper B. Hansen
2
W tym przypadku gubią się skrypty ze zmiennymi takimi jak $ some_var. Jak można to naprawić?
ATrubka
60

Możesz przekierować wyjście polecenia do pliku:

$ cat file > copy_file

lub dołącz do niego

$ cat file >> copy_file

Jeśli chcesz pisać bezpośrednio, polecenie to echo 'text'

$ echo 'Hello World' > file
Ssedano
źródło
3
Jeśli potrzebujesz uprawnień roota: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(dzięki powyższemu komentarzowi lukaserat)
aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
baetacos
źródło
38
Wyjaśnienie twojego kodu może znacznie przyczynić się do uczynienia go bardziej użytecznym dla innych. Nawet objaśnienia słownictwa, takie jak „dokument tutaj” i „przekierowanie”, mogą kierować osoby poszukujące do innych zasobów.
Palpatim
2
Wyjaśnienie nie jest tak konieczne dla czegoś takiego.
Bhargav Nanekalva
6
Wyjaśnienie nigdy nie jest konieczne, jeśli znasz już odpowiedź. Dla mnie powyższy kod nie jest pomocny z powodu braku szczegółów.
Søren Ullidtz
1
Po EOF - nie powinno być spacji.
Юрий Светлов
24

Wiem, że to cholernie stare pytanie, ale ponieważ OP dotyczy skryptów, a fakt, że Google mnie tu sprowadził, powinien również wspomnieć o otwarciu deskryptorów plików do odczytu i zapisu w tym samym czasie.

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

Następnie catplik na terminalu

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

Ten przykład powoduje, że plik poem.txt jest otwarty do odczytu i zapisu na deskryptorze pliku 3. Pokazuje także, że * nix box wie więcej fd niż wtedy stdin, stdout i stderr (fd 0,1,2). W rzeczywistości ma dużo. Zwykle maksymalna liczba deskryptorów plików, które jądro może przydzielić, można znaleźć w /proc/sys/file-maxlub, /proc/sys/fs/file-maxale użycie dowolnego fd powyżej 9 jest niebezpieczne, ponieważ może powodować konflikt z fd używanymi wewnętrznie przez powłokę. Więc nie przejmuj się i używaj tylko 0-9 fd. Jeśli potrzebujesz więcej 9 deskryptorów plików w skrypcie bash, powinieneś użyć innego języka :)

W każdym razie z fd można korzystać na wiele interesujących sposobów.

Tobi
źródło
14

Podoba mi się ta odpowiedź:

cat > FILE.txt <<EOF

info code info 
...
EOF

ale sugeruje, cat >> FILE.txt << EOFjeśli chcesz po prostu dodać coś na końcu pliku bez usuwania tego, co już istnieje

Lubię to:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
źródło
1
Dodaj wyjaśnienie wraz z odpowiedzią na pytanie, w jaki sposób ta odpowiedź pomaga OP w rozwiązaniu bieżącego problemu
ρяσсρєя K
9

Przeniesienie mojego komentarza jako odpowiedzi, zgodnie z żądaniem @lycono

Jeśli musisz to zrobić z uprawnieniami roota, zrób to w następujący sposób:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
źródło
6
Możesz uniknąć uruchamiania powłoki roota tylko w celu wydrukowania łańcucha. Spróbuj echo "some data for the file" | sudo tee -a fileName >/dev/nulluruchomić tylko teejako root.
tripleee
6

W środowiskach, w których dokumenty są niedostępne ( Makefile, Dockerfileitp.), Często można zastosować printfrozsądnie czytelne i wydajne rozwiązanie.

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
potrójny
źródło
1
Twój komentarz powyżej Wypróbuj echo „danych dla pliku” | sudo tee -a nazwa_pliku> / dev / null, aby uruchomić tee tylko jako root. było naprawdę przydatne!
Kojo
5

Myślałem, że istnieje kilka doskonale dobrych odpowiedzi, ale nie ma zwięzłego podsumowania wszystkich możliwości; a zatem:

Podstawową zasadą większości odpowiedzi tutaj jest przekierowanie . Dwa są ważnymi operatorami przekierowania dla zapisu do plików:

Przekierowanie danych wyjściowych:

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

Dołączanie przekierowanego wyjścia

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

Tutaj Dokumenty

Inni wspomnieli, a nie ze stałego źródła wejściowego, takiego jak echo 'text', możesz również interaktywnie pisać do plików za pomocą „Dokumentu tutaj”, który jest również szczegółowo opisany w linku do podręcznika bash powyżej. Te odpowiedzi, np

cat > FILE.txt <<EOF lub cat >> FILE.txt <<EOF

skorzystaj z tych samych operatorów przekierowania, ale dodaj kolejną warstwę za pomocą „Dokumentów tutaj”. W powyższej składni piszesz do pliku FILE.txt za pomocą danych wyjściowychcat . Zapis odbywa się dopiero po tym, jak wejście interaktywne otrzyma określony ciąg, w tym przypadku „EOF”, ale może to być dowolny ciąg, np .:

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

działałoby równie dobrze. Tutaj Dokumenty również szukają różnych ograniczników i innych interesujących znaków podczas analizowania, więc zajrzyj do dokumentacji, aby uzyskać dodatkowe informacje na ten temat.

Tutaj Struny

Trochę skomplikowane i bardziej ćwiczenie w zrozumieniu zarówno przekierowania, jak i składni Here Documents, ale można połączyć składnię w stylu Here Document ze standardowymi operatorami przekierowań, aby uzyskać ciąg Here:

Przekierowanie wyjścia Cat

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

Dołączanie przekierowanego wyjścia cat input

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

topher217
źródło
0

Można również użyć tutaj dokumentu i vi, poniższy skrypt generuje plik FILE.txt z 3 liniami i interpolacją zmiennych

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

Plik będzie miał 3 linie, jak poniżej. „i” uruchamia tryb wstawiania vi i podobnie zamyka plik za pomocą Esc i ZZ.

#This is my var in text file
var = Test
#Thats end of text file
Subodh Sharma
źródło
0

to moja odpowiedź. $ cat file> plik_kopii

onoffon
źródło
1
co to jest plik i plik_kopii?
XPD