Si tengo una salida muy larga de un comando (línea única) 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.
Una forma es usar cut
:
command | cut -c1-8
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.
Estas son algunas otras formas de obtener solo los primeros 8 caracteres.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
Y si tienes bash
var=$(command)
echo ${var:0:8}
Otra solución de línea utilizando expansión de parámetros
echo ${Word:0:x}
EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3}
o/p: Hel
EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
Si tiene un Shell suficientemente avanzado (por ejemplo, lo siguiente funcionará en Bash, no estoy seguro sobre el guión), puede hacer lo siguiente:
read -n8 -d$'\0' -r <(command)
Después de ejecutar read ... <(command)
, sus caracteres estarán en la variable Shell REPLY
. Escriba help read
Para conocer otras opciones.
Explicación: el argumento -n8
De read
dice que queremos hasta 8 caracteres. El -d$'\0'
Dice leer hasta un valor 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 a -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 shells tienen una lectura que honra -N
En lugar de honrar -n
Y -d
. Continuando con la explicación: -r
Dice ignore \
- escapa, de modo que, por ejemplo, tratamos \\
Como dos caracteres, en lugar de un solo \
.
Finalmente, hacemos read ... <(command)
en lugar de command | read ...
Porque en la segunda forma, la lectura se ejecuta en una subshell que luego sale inmediatamente, perdiendo la información que acaba de leer.
Otra opción es hacer todo el procesamiento dentro de la subshell. Por ejemplo:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
Esto es portátil:
a="$(command)" # Get the output of the command.
b="????" # as many ? as characters are needed.
echo ${a%"${a#${b}}"} # select that many chars from $a
Para construir una cadena de caracteres de longitud variable tiene su propia pregunta aquí .
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 uso xxd
:
command | xxd -l$BYTES | xxd -r
Produce exactamente $BYTES
bytes, a menos que la salida de command
sea más corta, entonces exactamente esa salida.