Si la sortie d'une commande est très longue (ligne unique) mais que je sais que je ne veux que les premiers [x] (disons 8) caractères de la sortie, quelle est la manière la plus simple d'obtenir cela? Il n'y a pas de délimiteurs.
Une façon consiste à utiliser cut
:
command | cut -c1-8
Cela vous donnera les 8 premiers caractères de chaque ligne de sortie. Puisque cut
fait partie de POSIX, il est susceptible d'être sur la plupart des Unices.
Ce sont d'autres façons d'obtenir uniquement les 8 premiers caractères.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
Et si vous avez bash
var=$(command)
echo ${var:0:8}
Une autre solution de liner en utilisant expansion des paramètres
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 vous avez un Shell suffisamment avancé (par exemple, ce qui suit fonctionnera dans Bash, vous n'êtes pas sûr du tableau de bord), vous pouvez le faire:
read -n8 -d$'\0' -r <(command)
Après avoir exécuté read ... <(command)
, vos caractères seront dans la variable Shell REPLY
. Tapez help read
Pour en savoir plus sur les autres options.
Explication: l'argument -n8
De read
indique que nous voulons jusqu'à 8 caractères. Le -d$'\0'
Dit lire jusqu'à une valeur nulle, plutôt que vers une nouvelle ligne. De cette façon, la lecture se poursuivra sur 8 caractères même si l'un des caractères précédents est une nouvelle ligne (mais pas si c'est un null). Une alternative à -n8 -d$'\0'
Consiste à utiliser -N8
, Qui lit exactement 8 caractères ou jusqu'à ce que le stdin atteigne EOF. Aucun délimiteur n'est honoré. Cela correspond probablement mieux à vos besoins, mais je ne sais pas par hasard combien de coquilles ont une lecture qui honore -N
Au lieu d'honorer -n
Et -d
. Poursuivant l'explication: -r
Dit ignorer \
- s'échappe, de sorte que, par exemple, nous traitons \\
Comme deux caractères plutôt que comme un seul \
.
Enfin, nous faisons read ... <(command)
plutôt que command | read ...
Car dans le second formulaire, la lecture est exécutée dans un sous-shell qui est ensuite immédiatement quitté, perdant les informations que vous venez de lire.
Une autre option est de faire tout votre traitement à l'intérieur du sous-shell. Par exemple:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
C'est portable:
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
Pour construire une chaîne de longueur variable de caractères a sa propre question ici .
J'ai eu ce problème lors de la génération manuelle de fichiers de somme de contrôle dans le référentiel maven. Malheureusement cut -c
imprime toujours une nouvelle ligne à la fin de la sortie. Pour supprimer que j'utilise xxd
:
command | xxd -l$BYTES | xxd -r
Il génère exactement $BYTES
octets, sauf si la sortie de command
est plus courte, alors exactement cette sortie.