Si j'ai une très longue sortie d'une commande (une seule ligne) mais que je sais que je ne veux que les premiers [x] (disons 8) caractères de la sortie, quel est le moyen le plus simple de l'obtenir? Il n'y a pas de délimiteurs.
command-line
shell
text-processing
xénoterracide
la source
la source
Réponses:
Une façon est d'utiliser
cut
:Cela vous donnera les 8 premiers caractères de chaque ligne de sortie. Étant donné qu’il
cut
fait partie de POSIX, il est susceptible de figurer sur la plupart des Unices.la source
cut -c
sélectionne les caractères;cut -b
ouhead -c
sélectionne des octets. Cela fait une différence dans certains endroits (en pratique, lorsque vous utilisez UTF-8).cut -c-8
choisira parmi les caractères 1 à 8.cut
l'équivalent sous Windows est?command | dd bs=8 count=1 2>/dev/null
. Ne dis pas que c'est plus court ou supérieur. Juste une autre alternative.cut
,cut -c
fonctionne commecut -b
( autrement dit, cela ne fonctionne pas correctement pour les caractères multi-octets).Voici quelques autres moyens pour n’obtenir que les 8 premiers caractères.
Et si tu as bash
la source
command | sed 's/\(.\{8\}\).*/\1/'
ou si vos supports sed il:command | sed -r 's/(.{8}).*/\1/'
; Sinon, +1head -c
compte en octets , pas en caractères. De même, parmi les principales implémentations d'Awk, seul GNU awk gère correctement les caractères multi-octets - FreeBSD Awk et Mawk ne le font pas.Si vous avez un shell suffisamment avancé (par exemple, ce qui suit fonctionnera dans Bash, vous n'êtes pas certain du tiret), vous pouvez le faire:
Après exécution
read ... <(command)
, vos personnages seront dans la variable shellREPLY
. Tapezhelp read
pour en savoir plus sur les autres options.Explication: l'
-n8
argument àread
qui indique que nous voulons 8 caractères maximum. Le-d$'\0'
dit lu jusqu'à null, plutôt que sur une nouvelle ligne. De cette façon, la lecture continuera pour 8 caractères même si l’un des caractères précédents est une nouvelle ligne (mais pas si c’est nul). Une alternative à-n8 -d$'\0'
est d'utiliser-N8
, qui lit exactement 8 caractères ou jusqu'à ce que le stdin atteigne EOF. Aucun délimiteur n'est honoré. Cela répond probablement mieux à vos besoins, mais je ne sais pas au juste combien de coquilles ont une lecture qui honore-N
par opposition à honorer-n
et-d
. Continuant avec l'explication:-r
dit ignorer\
-escapes, de sorte que, par exemple, nous traitons\\
comme deux caractères plutôt que comme un seul\
.Enfin, nous le faisons
read ... <(command)
plutôt quecommand | read ...
parce que dans la seconde forme, la lecture est exécutée dans un sous-shell qui est ensuite immédiatement quitté, perdant ainsi les informations que vous venez de lire.Une autre option consiste à effectuer tous vos traitements dans le sous-shell. Par exemple:
la source
cut
.read -n <num>
; petite mise en garde: Bash 3.x (toujours en cours sur le système d'exploitation) interprète à tort<num>
comme un nombre d' octets et échoue donc avec les caractères multi-octets; cela a été corrigé dans Bash 4.x.Une autre solution one-liner utilisant l' expansion des paramètres
la source
x=8; echo ${word:0:$x}
au lieu de coder en dur le nombre entier.C'est portable:
Construire une chaîne de caractères de longueur variable a sa propre question ici .
la source
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
, une nouvelle ligne est toujours imprimée à la fin de la sortie. Pour supprimer que j'utilisexxd
:Il affiche exactement les
$BYTES
octets, sauf si lacommand
sortie de est plus courte, alors exactement cette sortie.la source
cut
la nouvelle ligne est de la| tr -d '\n'