J'ai un fichier texte que je génère dans une variable de mon script Shell. Cependant, je n'ai besoin que des 50 premiers caractères.
J'ai essayé d'utiliser cat ${filename} cut -c1-50
mais j'obtiens bien plus que les 50 premiers caractères? Cela peut être dû à cut
à la recherche de lignes (pas sûr à 100%), alors que ce fichier texte peut être une longue chaîne - cela dépend vraiment.
Existe-t-il un utilitaire dans lequel je peux diriger pour obtenir les premiers caractères X à partir d'une commande cat
?
head -c 50 file
Cela renvoie les 50 premiers octets.
N'oubliez pas que la commande n'est pas toujours implémentée de la même manière sur tous les systèmes d'exploitation. Sous Linux et macOS, il se comporte de cette façon. Sous Solaris (11), vous devez utiliser la version gnu dans/usr/gnu/bin /
Votre commande cut
fonctionne si vous utilisez un canal pour lui transmettre des données:
cat ${file} | cut -c1-50
Ou, en évitant une utilisation inutile du chat et en le rendant un peu plus sûr:
cut -c1-50 < "$file"
Notez que les commandes ci-dessus afficheront les 50 premiers caractères (ou octets, selon votre implémentation cut
) de chaque ligne d'entrée. Il devrait faire ce que vous attendez si, comme vous le dites, votre fichier est une énorme ligne.
dd status=none bs=1 count=50 if=${filename}
Cela renvoie les 50 premiers octets.
Jusqu'à présent, la plupart des réponses supposent que 1 octet = 1 caractère, ce qui peut ne pas être le cas si vous utilisez un environnement local non ASCII.
Une façon un peu plus robuste de le faire:
testString=$(head -c 200 < "${filename}") &&
printf '%s\n' "${testString:0:50}"
Notez que cela suppose:
ksh93
, bash
(ou un zsh
ou mksh
récent (bien que le seul jeu de caractères multi-octets pris en charge par mksh
soit UTF-8 et uniquement après set -o utf8-mode
)) et une version de head
qui prend en charge -c
(la plupart le font de nos jours, mais pas strictement standard).locale charmap
et file -- "$filename"
pour vérifier cela); sinon, définissez-le avec ie. LC_ALL=en_US.UTF-8
)head
, en supposant le pire des cas UTF-8 où tous les caractères sont encodés sur au plus 4 octets. Cela devrait couvrir la plupart des cas auxquels je peux penser.grep -om1 "^.\{50\}" ${filename}
Autre variante (pour la première ligne du fichier)
(IFS= read -r line <${filename}; echo ${line:0:50})
head -c 50 file.txt
affichera par exemple les 50 premiers caractères de file.txt.
hexdump
pour les imprimer sous forme de caractères hexadécimaux:hexdump -n 50 -v file.bin
affichera les 50 premiers octets de file.bin, par exemple.
Notez que sans le -v
option verbeuse, hexdump
remplacerait les lignes répétées par un astérisque (*
) au lieu. Voir ici: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#49461 .