web-dev-qa-db-fra.com

Récupération des premiers [x] caractères d'une chaîne dans un tube

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.

67
xenoterracide

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.

95
Steven D

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

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
2

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

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 .

1
user79743

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.

0