¿Abrir y escribir datos en un archivo de texto usando Bash?

247

¿Cómo puedo escribir datos en un archivo de texto automáticamente mediante scripts de shell en Linux?

Pude abrir el archivo. Sin embargo, no sé cómo escribirle datos.

Adnan
fuente

Respuestas:

409
echo "some data for the file" >> fileName
Triton Man
fuente
77
¿Cuál es el nombre de este operador? Me gustaría encontrar un manual al respecto.
Vlad T.
96
el operador> redirige la salida a un archivo que sobrescribe el archivo si existe. El >> se agregará a un archivo existente.
Triton Man
44
Gracias, aquí está el enlace a la página wiki, en caso de que alguien lo necesite es.wikipedia.org/wiki/…
Vlad T.
11
Si necesita hacer esto con privilegios de root, hágalo de esta manera:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
¿Qué pasa si mi texto es algo como esto y por cualquier razón, no puedo usar 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
fuego frío
fuente
1
Buena toma de salida multilínea.
Federico Zancan
8
Los novatos se beneficiarían de saber exactamente qué hacer con este archivo. Cómo guardarlo, cómo ejecutarlo, etc.
Danny
14
Por favor explique en lugar de simplemente poner un código. Sería mucho más útil para todos, especialmente para los novatos.
Casper B. Hansen
2
En este caso, los scripts con variables como $ some_var se pierden. ¿Cómo se puede arreglar?
ATrubka 01 de
60

Puede redirigir la salida de un comando a un archivo:

$ cat file > copy_file

o añádele

$ cat file >> copy_file

Si quieres escribir directamente el comando es echo 'text'

$ echo 'Hello World' > file
ssedano
fuente
3
Si necesita permiso de root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(gracias al comentario de lukaserat anterior)
aero
46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
baetacos
fuente
38
Una explicación de su código contribuiría en gran medida a que sea más útil para otros. Incluso las llamadas de vocabulario como "documento aquí" y "redirección" pueden dirigir a los buscadores a otros recursos.
Palpatim
2
La explicación no es tan necesaria para algo como esto.
Bhargav Nanekalva
66
La explicación nunca es necesaria cuando ya sabes la respuesta. Para mí, el código anterior no es útil debido a la falta de detalles.
Søren Ullidtz
1
Después de EOF - no debe haber espacios.
Срий Светлов
24

Sé que esta es una pregunta muy antigua, pero como el OP se trata de secuencias de comandos, y por el hecho de que Google me trajo aquí, también deberían mencionarse los descriptores de archivos abiertos para leer y escribir al mismo tiempo.

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

Luego catel archivo en la terminal

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

Este ejemplo hace que el archivo poem.txt esté abierto para leer y escribir en el descriptor de archivo 3. También muestra que los cuadros * nix conocen más fd que solo stdin, stdout y stderr (fd 0,1,2). En realidad tiene mucho. Por lo general, se puede encontrar el número máximo de descriptores de archivo que el núcleo puede asignar /proc/sys/file-maxo, /proc/sys/fs/file-maxpero usar cualquier fd por encima de 9 es peligroso ya que podría entrar en conflicto con los fd utilizados internamente por el shell. Así que no te molestes y solo usa fd's 0-9. Si necesita más los 9 descriptores de archivo en un script bash, debe usar un idioma diferente de todos modos :)

De todos modos, los fd se pueden usar de muchas maneras interesantes.

tobi
fuente
14

Me gusta esta respuesta:

cat > FILE.txt <<EOF

info code info 
...
EOF

pero sugeriría cat >> FILE.txt << EOFsi desea simplemente agregar algo al final del archivo sin eliminar lo que ya existe

Me gusta esto:

cat >> FILE.txt <<EOF

info code info 
...
EOF
Marat
fuente
1
Agregue alguna explicación con la respuesta sobre cómo esta respuesta ayuda a OP a solucionar el problema actual
ρяσѕρєя K
9

Mover mi comentario como respuesta, según lo solicitado por @lycono

Si necesita hacer esto con privilegios de root, hágalo de esta manera:

sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
fuente
66
Es posible que desee evitar ejecutar un shell raíz solo para imprimir una cadena. Intenta echo "some data for the file" | sudo tee -a fileName >/dev/nullejecutar solo teecomo root.
tripleee
6

Para entornos en los documentos no están disponibles aquí ( Makefile, Dockerfile, etc.) que puede utilizar a menudo printfpara una solución razonablemente legible y 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
tripleee
fuente
1
Tu comentario anterior Prueba echo "algunos datos para el archivo" | sudo tee -a fileName> / dev / null para ejecutar solo tee como root. fue realmente útil!
Kojo
5

Pensé que había algunas respuestas perfectamente buenas, pero no un resumen conciso de todas las posibilidades; así:

El principal principal detrás de la mayoría de las respuestas aquí es la redirección . Dos son operadores de redirección importantes para escribir en archivos:

Salida de redireccionamiento:

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

Salida redirigida anexa

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

Aquí documentos

Otros mencionaron, en lugar de una fuente de entrada fija como echo 'text' , también podría escribir de manera interactiva en los archivos a través de un "Documento aquí", que también se detalla en el enlace al manual de bash anterior. Esas respuestas, por ejemplo

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

utilice los mismos operadores de redireccionamiento, pero agregue otra capa a través de "Aquí Documentos". En la sintaxis anterior, escribe en FILE.txt a través de la salida decat . La escritura solo tiene lugar después de que la entrada interactiva recibe una cadena específica, en este caso 'EOF', pero podría ser cualquier cadena, por ejemplo:

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

funcionaría igual de bien. Aquí los documentos también buscan varios delimitadores y otros caracteres de análisis interesantes, así que eche un vistazo a los documentos para obtener más información al respecto.

Aquí cuerdas

Un poco complicado, y más de un ejercicio para comprender tanto la redirección como la sintaxis Here Documents, pero podría combinar la sintaxis de estilo Here Document con operadores de redireccionamiento estándar para convertirse en una cadena Here:

Salida de redireccionamiento de entrada cat

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

Agregar salida redirigida de entrada cat

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

topher217
fuente
0

También puede usar aquí el documento y vi, el siguiente script genera un FILE.txt con 3 líneas e interpolación variable

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

Entonces el archivo tendrá 3 líneas como a continuación. "i" es iniciar el modo de inserción vi y, de manera similar, cerrar el archivo con Esc y ZZ.

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

esta es mi respuesta. $ cat archivo> copy_file

onoffon
fuente
1
¿Qué es file y copy_file?
XPD