it-swarm-es.tech

Agarrando los primeros [x] caracteres para una cadena de una tubería

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.

67
xenoterracide

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.

95
Steven D

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}
26
user1606

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
2

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>
2
dubiousjim

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í .

1
user79743

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.

0