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.
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.
Risposte:
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 sia presente nella maggior parte degli Unices.
cut -c
seleziona i caratteri; cut -b
o head -c
seleziona i byte. Ciò fa la differenza in alcune versioni locali (in pratica, quando si utilizza UTF-8).
cut -c-8
selezionerà dal personaggio 1 a 8.
cut
l'equivalente su Windows è?
command | dd bs=8 count=1 2>/dev/null
. Non dire che è più corto o superiore. Solo un'altra alternativa.
cut
, cut -c
funziona come cut -b
(cioè, non funziona correttamente per i caratteri multi-byte).
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}
command | sed 's/\(.\{8\}\).*/\1/'
o se i supporti sed IT: command | sed -r 's/(.{8}).*/\1/'
; Altrimenti, +1
head -c
conta i byte , non i caratteri. Allo stesso modo, tra le principali implementazioni di Awk, solo GNU awk gestisce correttamente i caratteri multibyte - FreeBSD Awk e Mawk no.
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 l'esecuzione read ... <(command)
, i tuoi personaggi saranno nella variabile shell REPLY
. Digita help read
per conoscere altre opzioni.
Spiegazione: l' -n8
argomento per read
dire che vogliamo fino a 8 caratteri. Il -d$'\0'
dice letto fino a un null, piuttosto che 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 -n8 -d$'\0'
è usare -N8
, che legge esattamente 8 caratteri o fino a quando lo stdin non raggiunge EOF. Nessun delimitatore è onorato. Questo probabilmente 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 ignore \
-escapes, in modo che, per esempio, trattiamo \\
come due caratteri, piuttosto che come un singolo \
.
Infine, lo facciamo read ... <(command)
piuttosto che command | read ...
perché nella seconda forma, la lettura viene eseguita in una subshell che viene quindi 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>
cut
.
read -n <num>
; piccolo avvertimento: Bash 3.x (ancora corrente su SO) interpreta erroneamente <num>
un conteggio di byte e quindi fallisce con caratteri multi-byte; questo è stato risolto in Bash 4.x.
Un'altra soluzione di rivestimento utilizzando l' 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
x=8; echo ${word:0:$x}
invece di codificare per intero il numero intero.
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 una sua domanda qui .
Ho avuto questo problema durante la generazione manuale dei file di checksum nel repository Maven. Sfortunatamente cut -c
stampa sempre una nuova riga alla fine dell'output. Per sopprimere che io uso xxd
:
command | xxd -l$BYTES | xxd -r
Emette esattamente $BYTES
byte, a meno che l' command
output non sia più breve, quindi esattamente quell'output.
cut
la nuova riga finale è il pip in:| tr -d '\n'