Abrir e gravar dados em um arquivo de texto usando o Bash?

247

Como gravar dados em um arquivo de texto automaticamente através de scripts de shell no Linux?

Consegui abrir o arquivo. No entanto, não sei como gravar dados nele.

Adnan
fonte

Respostas:

409
echo "some data for the file" >> fileName
Triton Man
fonte
7
Qual é o nome desse operador? Eu gostaria de encontrar um manual sobre isso.
Vlad T.
96
o operador redireciona a saída para um arquivo substituindo o arquivo, se houver. O >> será anexado a um arquivo existente.
Triton Man
4
Obrigado, aqui está o link para a página de wiki, em precisa de alguém caso en.wikipedia.org/wiki/...
Vlad T.
11
Se você precisar fazer isso com privilégios de root, faça o seguinte:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
E se o meu texto é algo como este e por qualquer razão, não posso usar curlou 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
fogo legal
fonte
1
Boa visão da produção multilinha.
Federico Zancan
8
Os iniciantes se beneficiariam de saber exatamente o que fazer com esse arquivo. Como salvá-lo, como executá-lo, etc.
Danny
14
Por favor, explique ao invés de simplesmente colocar um pedaço de código. Isso tornaria muito mais útil para todos - especialmente para iniciantes.
Casper B. Hansen
2
Nesse caso, scripts com variáveis ​​como $ some_var se perdem. Como pode ser consertado?
ATrubka
60

Você pode redirecionar a saída de um comando para um arquivo:

$ cat file > copy_file

ou anexar a ele

$ cat file >> copy_file

Se você deseja escrever diretamente, o comando é echo 'text'

$ echo 'Hello World' > file
ssedano
fonte
3
Se você precisar de permissão root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(graças ao comentário de lukaserat acima) #
aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
baetacos
fonte
38
Uma explicação do seu código ajudaria muito a torná-lo mais utilizável para outras pessoas. Mesmo frases de vocabulário como "aqui documentam" e "redirecionamento" podem direcionar os pesquisadores para outros recursos.
Palpatim
2
A explicação não é tão necessária para algo assim.
Bhargav Nanekalva 17/08/2015
6
A explicação nunca é necessária quando você já sabe a resposta. Para mim, o código acima não é útil devido à falta de detalhes.
Søren Ullidtz 03/01
Você também pode simplesmente cat > FILE.txtpressionar Ctrl + D quando terminar .
wally 17/01
1
Após EOF - não deve haver espaços.
Юрий Светлов
24

Sei que essa é uma pergunta muito antiga, mas como o OP trata de scripts, e pelo fato de o google me trazer aqui, também devem ser mencionados os descritores de arquivos para leitura e gravação ao mesmo tempo.

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

Então cato arquivo no terminal

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

Este exemplo faz com que o arquivo poem.txt seja aberto para leitura e gravação no descritor de arquivo 3. Ele também mostra que as caixas * nix conhecem mais fd's do que apenas stdin, stdout e stderr (fd 0,1,2). Na verdade, vale muito. Normalmente, o número máximo de descritores de arquivos que o kernel pode alocar pode ser encontrado /proc/sys/file-maxou /proc/sys/fs/file-maxmas usar qualquer fd acima de 9 é perigoso, pois pode entrar em conflito com os fd usados ​​pelo shell internamente. Portanto, não se incomode e use apenas os 0-9 dos fd. Se você precisar mais dos 9 descritores de arquivo em um script bash, use um idioma diferente de qualquer maneira :)

De qualquer forma, os fd's podem ser usados ​​de várias maneiras interessantes.

tobi
fonte
14

Eu gosto desta resposta:

cat > FILE.txt <<EOF

info code info 
...
EOF

mas sugiro cat >> FILE.txt << EOFque você queira adicionar algo ao final do arquivo sem apagar o que já existe

Como isso:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
fonte
1
Adicione um pouco de explicação com a resposta de como essa resposta ajuda OP na fixação edição atual
ρяσѕρєя K
9

Movendo meu comentário como resposta, conforme solicitado por @lycono

Se você precisar fazer isso com privilégios de root, faça o seguinte:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
fonte
6
Você pode evitar executar um shell raiz apenas para imprimir uma sequência. Tente echo "some data for the file" | sudo tee -a fileName >/dev/nullexecutar apenas teecomo root.
Tripleee 3/07
6

Para ambientes em que os documentos aqui não estão disponíveis ( Makefile, Dockerfileetc), você pode frequentemente usar printfuma solução razoavelmente legível e eficiente.

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
triplo
fonte
1
Seu comentário acima Tente eco "alguns dados para o arquivo" | sudo tee -a fileName> / dev / null para executar apenas tee como root. foi realmente útil!
26719 Kojo
5

Eu pensei que havia algumas respostas perfeitamente boas, mas nenhum resumo conciso de todas as possibilidades; portanto:

O principal principal por trás da maioria das respostas aqui é o redirecionamento . Dois são importantes operadores de redirecionamento para gravar em arquivos:

Redirecionando a saída:

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

Anexando saída redirecionada

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

Aqui Documentos

Outros mencionados, e não de uma fonte de entrada fixa como echo 'text', você também pode gravar de maneira interativa em arquivos através de um "Aqui Documento", que também é detalhado no link para o manual do bash acima. Essas respostas, por exemplo

cat > FILE.txt <<EOF ou cat >> FILE.txt <<EOF

faça uso dos mesmos operadores de redirecionamento, mas adicione outra camada via "Here Documents". Na sintaxe acima, você escreve no FILE.txt através da saída de cat. A gravação ocorre somente após a entrada interativa receber uma sequência específica, neste caso 'EOF', mas pode ser qualquer sequência, por exemplo:

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

funcionaria tão bem. Aqui, os Documentos também procuram vários delimitadores e outros caracteres de análise interessantes; consulte os documentos para obter mais informações sobre isso.

Here Strings

Um pouco complicado e mais um exercício para entender o redirecionamento e a sintaxe do Here Documents, mas você pode combinar a sintaxe do estilo Here Document com os operadores de redirecionamento padrão para se tornar uma String Here:

Redirecionando a saída da entrada do gato

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

Anexando saída redirecionada da entrada cat

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

topher217
fonte
0

Também pode usar aqui document e vi, o script abaixo gera um FILE.txt com 3 linhas e interpolação variável

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

O arquivo terá três linhas, como abaixo. "i" é iniciar o modo de inserção do vi e, da mesma forma, fechar o arquivo com Esc e ZZ.

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

esta é a minha resposta. $ cat arquivo> copy_file

onoffon
fonte
1
o que é file e copy_file?
XPD