it-swarm.it

Afferrare i primi [x] caratteri per una stringa da una pipe

Se ho un output molto lungo da un comando (riga singola) ma so che voglio solo i primi [x] (diciamo 8) caratteri dell'output, qual è il modo più semplice per ottenerlo? Non ci sono delimitatori.

67
xenoterracide

Un modo è usare cut:

 command | cut -c1-8

Questo ti darà i primi 8 caratteri di ogni riga di output. Poiché cut fa parte di POSIX, è probabile che si trovi sulla maggior parte degli Unices.

95
Steven D

Questi sono altri modi per ottenere solo i primi 8 caratteri.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

E se hai bash

var=$(command)
echo ${var:0:8}
26
user1606

Un'altra soluzione di rivestimento utilizzando espansione dei parametri

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

Se si dispone di una Shell sufficientemente avanzata (ad esempio, in Bash funzionerà quanto segue, non si è sicuri del trattino), è possibile eseguire:

read -n8 -d$'\0' -r <(command)

Dopo aver eseguito read ... <(command), i tuoi personaggi saranno nella variabile Shell REPLY. Digita help read Per conoscere altre opzioni.

Spiegazione: l'argomento -n8 Su read dice che vogliamo fino a 8 caratteri. -d$'\0' Dice read fino a un valore null, anziché a una nuova riga. In questo modo la lettura continuerà per 8 caratteri anche se uno dei caratteri precedenti è una nuova riga (ma non se è un valore nullo). Un'alternativa a -n8 -d$'\0' È usare -N8, Che legge esattamente 8 caratteri o fino a quando lo stdin non raggiunge EOF. Nessun delimitatore è onorato. Probabilmente questo si adatta meglio alle tue esigenze, ma non so con certezza quante shell hanno una lettura che onora -N Invece di onorare -n E -d. Continuando con la spiegazione: -r Dice ignora \ - scappa, in modo che, ad esempio, trattiamo \\ Come due caratteri, anziché come un singolo \.

Infine, facciamo read ... <(command) piuttosto che command | read ... Perché nella seconda forma, la lettura viene eseguita in una subshell che viene immediatamente chiusa, perdendo le informazioni che hai appena letto.

Un'altra opzione è eseguire tutta l'elaborazione all'interno della subshell. Per esempio:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
2
dubiousjim

Questo è portatile:

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

Costruire una stringa di lunghezza variabile di caratteri ha la sua domanda qui .

1
user79743

Ho avuto questo problema durante la generazione manuale dei file di checksum nel repository Maven. Purtroppo cut -c stampa sempre una nuova riga alla fine dell'output. Per sopprimere che uso xxd:

command | xxd -l$BYTES | xxd -r

Emette esattamente $BYTES byte, a meno che l'output di command non sia più breve, quindi esattamente quell'output.