Si tengo una salida realmente larga de un comando (línea simple) pero sé que solo quiero los primeros [x] (digamos 8) caracteres de la salida, ¿cuál es la forma más fácil de obtener eso? No hay delimitadores.
command-line
shell
text-processing
xenoterracida
fuente
fuente
Respuestas:
Una forma es usar
cut
:Esto le dará los primeros 8 caracteres de cada línea de salida. Como
cut
es parte de POSIX, es probable que esté en la mayoría de los Unices.fuente
cut -c
selecciona caracteres;cut -b
ohead -c
selecciona bytes. Esto marca la diferencia en algunos entornos locales (en la práctica, cuando se usa UTF-8).cut -c-8
seleccionará del personaje 1 al 8.cut
es equivalente en Windows?command | dd bs=8 count=1 2>/dev/null
. No digo que sea más corto o superior. Solo otra alternativa.cut
,cut -c
funciona comocut -b
(es decir, no funciona correctamente para caracteres de varios bytes).Estas son algunas otras formas de obtener solo los primeros 8 caracteres.
Y si tienes bash
fuente
command | sed 's/\(.\{8\}\).*/\1/'
o si su sed lo admite:command | sed -r 's/(.{8}).*/\1/'
; De lo contrario, +1head -c
cuenta que cuenta bytes , no caracteres. De manera similar, entre las principales implementaciones de Awk, solo GNU awk maneja los caracteres de varios bytes correctamente; FreeBSD Awk y Mawk no lo hacen.Si tiene un shell suficientemente avanzado (por ejemplo, lo siguiente funcionará en Bash, no estoy seguro sobre el guión), puede hacer lo siguiente:
Después de ejecutar
read ... <(command)
, tus personajes estarán en la variable de shellREPLY
. Escribahelp read
para conocer otras opciones.Explicación: el
-n8
argumentoread
dice que queremos hasta 8 caracteres. El-d$'\0'
dicho lee hasta un nulo, en lugar de una nueva línea. De esta manera, la lectura continuará para 8 caracteres incluso si uno de los caracteres anteriores es una nueva línea (pero no si es nulo). Una alternativa-n8 -d$'\0'
es usar-N8
, que lee exactamente 8 caracteres o hasta que el stdin alcanza EOF. No se honra ningún delimitador. Eso probablemente se adapte mejor a sus necesidades, pero no sé de antemano cuántos proyectiles tienen una lectura que honra-N
en lugar de honrar-n
y-d
. Continuando con la explicación:-r
dice ignore\
-escapes, de modo que, por ejemplo, tratemos\\
como dos caracteres, en lugar de uno solo\
.Finalmente, lo hacemos en
read ... <(command)
lugar de hacerlocommand | read ...
porque en la segunda forma, la lectura se ejecuta en una subshell que luego se cierra inmediatamente, perdiendo la información que acaba de leer.Otra opción es hacer todo el procesamiento dentro de la subshell. Por ejemplo:
fuente
cut
.read -n <num>
; pequeña advertencia: Bash 3.x (aún actual en el sistema operativo) interpreta erróneamente<num>
como un recuento de bytes y, por lo tanto, falla con caracteres de varios bytes; Esto se ha solucionado en Bash 4.x.Otra solución única mediante el uso de expansión de parámetros
fuente
x=8; echo ${word:0:$x}
lugar de codificar el número entero.Esto es portátil:
Construir una cadena de caracteres de longitud variable tiene su propia pregunta aquí .
fuente
Tuve este problema al generar manualmente archivos de suma de comprobación en el repositorio maven. Desafortunadamente,
cut -c
siempre imprime una nueva línea al final de la salida. Para suprimir que usoxxd
:Produce exactamente
$BYTES
bytes, a menos que lacommand
salida de 's sea más corta, entonces exactamente esa salida.fuente
cut
de la nueva línea final es introducirlo en:| tr -d '\n'