Terminé escribiendo una pequeña secuencia de comandos rápida para esto en Python, pero me preguntaba si había una utilidad en la que pudiera alimentar el texto que antepondría cada línea con algo de texto, en mi caso específico, una marca de tiempo. Idealmente, el uso sería algo como:
cat somefile.txt | prepend-timestamp
(Antes de responder sed, probé esto:
cat somefile.txt | sed "s/^/`date`/"
Pero eso solo evalúa el comando de fecha una vez cuando se ejecuta sed, por lo que la misma marca de tiempo se antepone incorrectamente a cada línea).
cat somefile.txt
un poco "engañoso"? Espero que suceda "a la vez" y tenga una sola marca de tiempo. ¿No sería este un mejor programa de prueba(echo a; sleep 1; echo b; sleep 3; echo c; sleep 2)
:?Respuestas:
Podría intentar usar
awk
:Es posible que deba asegurarse de que
<command>
produzca una salida con buffer de línea, es decir, enjuague su flujo de salida después de cada línea; la marca de tiempo que seawk
agrega será el momento en que el final de la línea apareció en su canal de entrada.Si awk muestra errores, intente en su
gawk
lugar.fuente
gawk
y usarlo en lugar deawk
. Si tiene MacPorts:sudo port install gawk
awk
'sstrftime()
no tiene precisión de milisegundos. Sin embargo, puedes usar eldate
comando. Básicamente, solo recorta nanosegundos a tres caracteres. Se parece a esto:COMMAND | while read -r line; do echo "$(date '+%Y-%m-%d %T.%3N') $line"; done
. Tenga en cuenta que puede abreviar% H:% M:% S con% T. Si aún desea usarloawk
por algún motivo, puede hacer lo siguiente:COMMAND | awk '{ "date +%Y-%m-%d\\ %T.%3N" | getline timestamp; print timestamp, $0; fflush(); }'
ts
from moreutils agregará una marca de tiempo a cada línea de entrada que le dé. También puede formatearlo usando strftime.Para instalarlo:
fuente
bad command 2>&1 | ts
resultados enJan 29 19:58:31 -bash: bad: command not found
2014 Mar 21 18:07:28
. ¿Como lo consigo?strftime
cadena de formato como argumento:[.. command ..] | ts '%Y %b %d %T'
por ejemplo.brew install moreutils
. Para generar UTC, puede configurar TZ localmente, por ejemplols -l |TZ=UTC ts '%Y-%m-%dT%H:%M:%SZ'
ruby -e "puts 1; STDOUT.flush; sleep 1; puts 2; STDOUT.flush; sleep 2; puts 3" | ts '%F %T'
anotar , disponible a través de ese enlace o como
annotate-output
en eldevscripts
paquete Debian .fuente
Destilando las respuestas dadas a la más simple posible:
En Ubuntu, provienen de los paquetes expect-dev y moreutils.
fuente
expect
,expect-dev
pero este último atrae al primero, así que esto funciona. (Ubuntu 14.10, me pregunto si el binario se movió a un paquete diferente en algún momento).expect-dev
unbuffer $COMMAND | ts -s %.s
(-s
si es por tiempo transcurrido y%.s
por tiempo en segundos con parte fraccional)¿Qué tal esto?
A juzgar por su deseo de obtener marcas de tiempo en vivo, ¿tal vez quiera hacer una actualización en vivo en un archivo de registro o algo así? Tal vez
fuente
tail -f /path/to/log | perl -pne 'use POSIX qw(strftime); print strftime "%Y-%m-%dT%H:%M:%SZ ", gmtime();'
obtener una fecha de estilo ISO8601 / RFC3339 en lugar del wacko que produce la versión más simple.BEGIN { $|++; }
antes de la declaración de impresión para que Perl vacíe su salida con cada línea.ls | perl -pne 'print localtime." "'
. La conversión escalar ocurre debido a la concatenación de cadenas.-p
y las-n
opciones? Parece que-n
es redundante si lo ha especificado-p
.Solo voy a lanzar esto: hay un par de utilidades en daemontools llamadas tai64n y tai64nlocal que están hechas para preimprimir marcas de tiempo para registrar mensajes.
Ejemplo:
fuente
La respuesta de Kieron es la mejor hasta ahora. Si tiene problemas porque el primer programa está almacenando el búfer, puede usar el programa unbuffer:
Se instala por defecto en la mayoría de los sistemas Linux. Si necesita construirlo usted mismo, es parte del paquete esperado
http://expect.nist.gov
fuente
Use el comando read (1) para leer una línea a la vez desde la entrada estándar, luego envíe la línea antepuesta con la fecha en el formato que elija usando date (1).
fuente
No soy un tipo de Unix, pero creo que puedes usar
fuente
fuente
Aquí está mi solución awk (de un sistema Windows / XP con MKS Tools instalado en el directorio C: \ bin). Está diseñado para agregar la fecha y hora actuales en la forma mm / dd hh: mm al comienzo de cada línea que ha obtenido esa marca de tiempo del sistema a medida que se lee cada línea. Por supuesto, podría usar el patrón BEGIN para obtener la marca de tiempo una vez y agregar esa marca de tiempo a cada registro (de todos modos). Hice esto para etiquetar un archivo de registro que se estaba generando para stdout con la marca de tiempo en el momento en que se generó el mensaje de registro.
/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;
donde "patrón" es una cadena o expresión regular (sin las comillas) que debe coincidir en la línea de entrada, y es opcional si desea hacer coincidir todas las líneas de entrada.
Esto también debería funcionar en los sistemas Linux / UNIX, simplemente elimine el C \: \\ bin \\ que sale de la línea
Esto, por supuesto, supone que el comando "fecha" lo lleva al comando estándar de visualización / configuración de fecha de Linux / UNIX sin información de ruta específica (es decir, su variable de RUTA de entorno está configurada correctamente).
fuente
Mezclando algunas respuestas anteriores de natevw y Frank Ch. Eigler
Tiene milisegundos, funciona mejor que llamar a un
date
comando externo cada vez y se puede encontrar perl en la mayoría de los servidores.Versión alternativa con descarga y lectura en bucle:
fuente
printf "%s+%06d %s", (strftime "%Y-%m-%dT%H:%M:%S", gmtime($s)), $ms, $_;
puedes hacer esto (con gnu / sed ):
ejemplo:
por supuesto, puede usar otras opciones de la fecha del programa . simplemente reemplace
date +%T
con lo que necesita.fuente
La respuesta de caerwyn se puede ejecutar como una subrutina, lo que evitaría los nuevos procesos por línea:
fuente
date
se genere en cada línea?timestamp() { while read line; do echo "$(date) $line"; done; }; export -f timestamp
en un script que obtengas.date
para cada línea, intente utilizar bashprintf
incorporado con formato % (datepec) T. Entonces puede parecertimestamp() { while IFS= read -r line; do printf "%(%F %T)T %s\n" -1 "$line"; done; }
. Las conchas incorporadas no se generarán. El formato Datespec es como, porstrftime(3)
ejemplo,date
formatos. Esto requiere bash, no estoy seguro desde qué versión admite eseprintf
especificador.Descargo de responsabilidad : la solución que propongo no es una utilidad incorporada de Unix.
Me enfrenté a un problema similar hace unos días. No me gustaba la sintaxis y las limitaciones de las soluciones anteriores, por lo que rápidamente elaboré un programa en Ir para hacer el trabajo por mí.
Puede consultar la herramienta aquí: preftime
Hay ejecutables prediseñados para Linux, MacOS y Windows en la prensa sección del proyecto GitHub.
La herramienta maneja líneas de salida incompletas y tiene (desde mi punto de vista) una sintaxis más compacta.
<command> | preftime
No es ideal, pero pensé que lo compartiría en caso de que ayude a alguien.
fuente
hacerlo con
date
ytr
yxargs
en OSX:si quieres milisegundos:
pero tenga en cuenta que en OSX, date no le da la opción% N, por lo que deberá instalar gdate (
brew install coreutils
) y finalmente llegar a esto:fuente
Si el valor que está anteponiendo es el mismo en cada línea, inicie emacs con el archivo y luego:
Ctrl + <space>
al comienzo del archivo (para marcar ese punto), luego desplácese hacia abajo hasta el comienzo de la última línea (Alt +> irá al final del archivo ... que probablemente también incluirá la tecla Shift, luego Ctrl + a para ir al comienzo de esa línea) y:
Ctrl + x r t
Cuál es el comando para insertar en el rectángulo que acaba de especificar (un rectángulo de 0 de ancho).
2008-8-21 6:45 PM <enter>
O lo que quiera anteponer ... entonces verá ese texto antepuesto a cada línea dentro del rectángulo de ancho 0.
ACTUALIZACIÓN: Me acabo de dar cuenta de que no quieres la MISMA fecha, por lo que esto no funcionará ... aunque es posible que puedas hacerlo en emacs con una macro personalizada un poco más complicada, pero aún así, este tipo de edición de rectángulo es bastante bueno saber sobre ...
fuente