¿Cuál es la forma más rápida de agregar texto a un archivo desde la línea de comandos?

30

Ocasionalmente, pienso que quiero escribir en un archivo mientras estoy en la terminal. Quisiera que todas estas notas estén en el mismo archivo, solo enumeradas una tras otra. También me gustaría una etiqueta de fecha / hora en cada uno.

¿Es posible hacer esto sin tener que abrir el archivo cada vez? ¿Puedo ingresarlo en la terminal y agregarlo al archivo cada vez con un comando o script?

Estoy usando GNU BASH.

Brian Dant
fuente

Respuestas:

25

Escríbete un script de shell llamado "n". Pon esto en esto:

#!/bin/sh
notefile=/home/me/notefile
date >> $notefile
emacs $notefile -f end-of-buffer

Recomiendo esto en lugar de cat >> notefileporque:

  1. Un día tendrás tanta prisa que buscarás el >> y teclearás> y borrarás tu archivo.
  2. Emacs comienza en cinco centésimas de segundo en mi Mac Mini. Me toma una décima de segundo comenzar con un sistema basado en Celeron de diez años que tengo sentado. Si no puede esperar tanto tiempo para comenzar a escribir, entonces ya es una máquina y no necesita tomar notas. :)

Si insiste en evitar un editor de texto, use una función de shell:

n () { date >> /home/me/notefile; cat >> /home/me/notefile; }

que debería funcionar en todos los shells que reclaman compatibilidad con Bourne shell.

Kyle Jones
fuente
1
¿Cómo nescribe la función en el archivo? ¿No te refieres a algo como un en echo "$*"lugar de UUOC ? ¿Cómo incorpora la etiqueta de fecha / hora?
jasonwryan
1
No del todo inútil. Se lee desde stdin, que es donde el usuario escribirá su nota. Sin embargo, olvidé el sello de fecha.
Kyle Jones
No estoy necesariamente de acuerdo con el UUOC, pero tienes que señalar la fecha ...
jasonwryan
55
+1 agradable codificación defensiva y justificación contra el inevitable error tipográfico.
msw
2
Kyle, obviamente no tienes 90 MB .emacs.d. Ay, tengo que limpiar eso.
quodlibetor
19

Además, para escribir varias líneas en un archivo desde la línea de comandos, haga lo siguiente:

cat >> sometextfile.txt << EOF
text
more text
and another line
EOF
desbordamiento
fuente
1
O cat > sometextfile.txt << EOFpara sobrescribir el archivo existente.
mbomb007
10

Solo usa echo:

echo $(date) Hi. >> notes.txt

Puede usar >> para agregar a un archivo, o usar> para sobrescribirlo.

Rob Wouters
fuente
3

¡Muchas lindas campanas y silbatos aquí!

Método KISS:

date >>filename; cat >>filename
Jan Steinman
fuente
2

Si tiene instalado Ruby en su computadora, puede usar https://github.com/minhajuddin/taskr . De esta manera obtienes una buena vista de tus notas con etiquetas y las horas transcurridas.

Captura de pantalla del Taskr

Khaja Minhajuddin
fuente
Bueno, las capturas de pantalla a menudo se ven muy bien, pero si puedes, es mucho mejor si usas copiar y pegar.
Peter dice reinstalar a Mónica el
1

Dependiendo de sus necesidades, syslogd podría ser otra herramienta para examinar detenidamente. El comando

theuser@tetrad:~$ logger This message is sent to syslog

registrará el mensaje con la facilidad user.notice. Con muchos sistemas Linux, esto será suficiente para tener un archivo /var/log/user.log abierto y anexado, con otros puede que necesite definir un manejo para esa instalación y nivel de registro (o, según la instalación que elija, el local0 a local7 las instalaciones son generalmente libres de asignar a cosas como esta.

Tiene el beneficio de poder (también conocido como configurable) enviar notas desde las máquinas cliente a un servidor de registro central, algo que me gusta usar para realizar un seguimiento de las acciones administrativas, ya que conserva la información de marca de tiempo, usuario y host de forma automática, mientras mantiene las acciones en orden .

salida resultante en archivo local:

theuser@tetrad:~$ tail /var/log/user.log
Jan 31 07:18:37 tetrad theuser: This message is sent to syslog

Ejemplo para la línea de configuración de syslog en Solaris :

local5.notice             ifdef(`LOGHOST', /var/log/diary, @loghost)

Nota: Se procesa ifdefpreviamente con m4, en la máquina con el nombre de host / hostalias "loghost", los mensajes se registrarán en el archivo / var / log / diary, en todos los demás, se enviarán al servicio remoto de syslog en loghost. Para probar este tipo de configuración, el archivo de configuración se puede enviar a través de m4 para expansión (deje de lado -D LOGHOSTpara ver cómo se vería en un sistema no llamado loghost :

theuser@solstice$ /usr/ccs/bin/m4 -D LOGHOST /etc/syslog.conf
Tatjana Heuser
fuente
1

Taskwarrior puede hacer lo que quería un poco mejor que un simple script de shell. El tutorial de 30 segundos debería decirle si estoy en lo cierto o no.

Sardathrion - Restablece a Monica
fuente
1
echo "`date` text here" >> filename

o

echo "text here `date`"|tee -a filename

más en tee

Balaswamy vaddeman
fuente
solo
backtick
1
Para lo que vale, recomendaría usar $(..)sobre los backticks para la sustitución de comandos. Más información: unix.stackexchange.com/questions/11576/…
rahmu
0

Combinando algunas respuestas diferentes para lograr lo que buscaba, que eran múltiples opciones.

  1. Rápido
    user @ hostname: ~ / Documents $ echo text >> nombre de archivo
    user @ hostname: ~ / Documents $ cat filename
    texto
    
  2. Líneas múltiples
    user @ hostname: ~ / Documents $ cat >> filename2 << EOF
    > línea de texto 1
    > línea de texto 2
    > línea de texto 3
    > EOF
    usuario @ nombre de host: ~ / Documentos $ cat filename2  
    línea de texto 1
    línea de texto 2
    línea de texto 3
    
    1. Modificar un archivo en un número de línea dado

      user @ hostname: ~ / Documents $ sed -i '2iinserting new line' filename2
      usuario @ nombre de host: ~ / Documentos $ cat filename2
      línea de texto 1
      insertando nueva línea
      línea de texto 2
      línea de texto 3
      
    conman253
    fuente