J'ai un fichier texte que je sors en sortie d'une variable dans 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 beaucoup plus que les 50 premiers caractères? Cela peut être dû à la cut
recherche de lignes (pas à 100% sûres), alors que ce fichier texte pourrait être une longue chaîne - cela dépend vraiment.
Existe-t-il un utilitaire dans lequel je puisse accéder pour obtenir les X premiers caractères d'une cat
commande?
|
?cat ${filename} | cut -c1-50
Réponses:
Cela retourne les 50 premiers octets.
Notez 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 de / usr / gnu / bin /.
la source
-c
option. Je choisirais plutôt dd (1) .GNU coreutils 5.97
) le fait.-c
comme une option valide, cependant, il dépend donc de votre environnement local. unix.com/man-page/posix/1/headVotre
cut
commande fonctionne si vous utilisez un canal pour lui transmettre des données:Ou, en évitant une utilisation inutile du chat et en le rendant un peu plus sûr:
Notez que les commandes ci-dessus imprimeront les 50 premiers caractères (ou octets, selon votre
cut
implémentation) de chaque ligne d'entrée . Il convient de faire ce que vous attendez si, comme vous le dites, votre fichier est une énorme ligne.la source
Cela retourne les 50 premiers octets.
la source
status=none
indicateur. Utilisez2>/dev/null
plutôt (et citez correctement):dd if="$filename" bs=1 count=50 2>/dev/null
(même si, envisagez d'utiliserbs=50 count=1
pour réduire le nombre d'appels système impliqués).status=none
quand utiliser Ubuntu 14.04, coreutils 8.21, mais vous avez le droit de l'utiliser2>/dev/null
si vous utilisez une version antérieure.read()
des 50 octets. Par exemple, s'ilfile
s'agit d'un canal et que moins de caractères sont disponibles, moins d'octets seront renvoyés. Pour avoir l’équivalent dehead -c50
, vous devez utiliser la spécificité GNUiflag=fullblock
.Jusqu'à présent, la plupart des réponses supposent qu'un caractère sur 1 octet = 1, ce qui peut ne pas être le cas si vous utilisez des paramètres régionaux non-ASCII.
Une façon un peu plus robuste de le faire:
Notez que cela suppose:
ksh93
,bash
(ou un récentzsh
oumksh
(bien que le seul jeu de caractères multi-octets pris en charge parmksh
est UTF-8 et seulement aprèsset -o utf8-mode
)) et une versionhead
que les supports-c
( la plupart de nos jours, mais pas strictement standard).locale charmap
etfile -- "$filename"
vérifiez-le); sinon, définissez-le avec c.-à-d.LC_ALL=en_US.UTF-8
)head
, en supposant le cas UTF-8 dans le cas le plus défavorable, où tous les caractères sont codés sur au plus 4 octets. Cela devrait couvrir la plupart des cas auxquels je peux penser.la source
head
, ou une autre de ses implémentations, qui ajoute l’-c
option nōn-standard . Mais vous avez déjà besoin de GNU bash. (Remarque:mksh
le mode UTF-8 pourrait faire cela pour les fichiers encodés en UTF-8.) Je demanderais à l'OP s'ils ont besoin d'octets ou de caractères multi-octets; simplement, "caractères" est un terme vague / générique.$filename
ou$testString
ne contient pas de nouvelle ligne vierge, de caractère générique ou de début-
.${var:offset:length}
construction que vous utilisez ici provient en fait deksh93
et est également prise en charge par les versions récentes dezsh
(zsh
possède la sienne$testString[1,50]
). Vous avez besoin${testString:0:50}
deksh93
etzsh
cependant.Autre variante (pour la première ligne du fichier)
la source
read
etecho
? Oubash expansion
?grep
(regexp), et oui, l'utilisation de shell ici (indice: la première ligne peut être grande). (Cela étant dit, le bashisme n'est pas non plus dans POSIX, mais la plupart des obus implémentent cela.)1. Pour les fichiers ASCII, faites comme @DisplayName dit:
va imprimer les 50 premiers caractères de file.txt, par exemple.
2. Pour les données binaires, utilisez-les
hexdump
pour les imprimer en caractères hexadécimaux:va imprimer les 50 premiers octets de file.bin, par exemple.
Notez que sans l'
-v
option verbose,hexdump
les lignes répétées seraient remplacées par un astérisque (*
). Voir ici: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613 .la source
Vous pouvez utiliser sed pour cela, ce qui résoudra le problème assez facilement
la source
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}