web-dev-qa-db-fra.com

obtenir les premiers caractères X de la commande cat?

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?

51
jkj2000
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 /

71
DisplayName

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.

31
terdon
dd status=none bs=1 count=50 if=${filename}

Cela renvoie les 50 premiers octets.

8
doneal24

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:

  1. Vous utilisez 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).
  2. Les paramètres régionaux actuels sont définis sur le même codage que le fichier (tapez locale charmap et file -- "$filename" pour vérifier cela); sinon, définissez-le avec ie. LC_ALL=en_US.UTF-8)
  3. J'ai pris les 200 premiers octets du fichier avec 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.
5
Calimo
grep -om1 "^.\{50\}" ${filename}

Autre variante (pour la première ligne du fichier)

(IFS= read -r line <${filename}; echo ${line:0:50})
2
Costas

1. Pour les fichiers ASCII, faites comme le dit @DisplayName:

head -c 50 file.txt

affichera par exemple les 50 premiers caractères de file.txt.

2. Pour les données binaires, utilisez 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 .

1
Gabriel Staples