Existe-t-il une commande comme cat
sous Linux qui peut renvoyer une quantité spécifiée de caractères à partir d'un fichier?
par exemple, j'ai un fichier texte comme:
Hello world
this is the second line
this is the third line
Et je veux quelque chose qui renverrait les 5 premiers caractères, qui serait "bonjour".
Merci
linux
command-line
pbreault
la source
la source
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
consomme aussi" world\n"
ce qui est perdu à jamais.Réponses:
head
fonctionne aussi:.. va extraire les 100 premiers octets et les renvoyer.
Ce qui est bien d'utiliser
head
pour cela, c'est que la syntaxe destail
correspondances:Vous pouvez les combiner pour obtenir des plages d'octets. Par exemple, pour obtenir les 100 seconds octets d'un fichier, lisez les 200 premiers avec
head
et utilisez tail pour obtenir les 100 derniers:la source
head
, puis utiliseztail
pour obtenir les 10 derniers, par exemple:head -c 20 file | tail -c 10
Vous pouvez utiliser dd pour extraire des blocs d'octets arbitraires.
Par exemple,
copierait les octets 1235 à 1239 de son entrée vers sa sortie, et rejetterait le reste.
Pour obtenir simplement les cinq premiers octets de l'entrée standard, procédez comme suit:
Notez que, si vous souhaitez spécifier le nom du fichier d'entrée, dd a une analyse d'argument à l'ancienne, vous feriez donc:
Notez également que dd annonce verbalement ce qu'il a fait, alors pour le jeter, faites:
ou
la source
dd bs=1
force dd à lire et à écrire un seul caractère à la fois, ce qui est beaucoup plus lent quehead
lorsque le nombre est grand. Ce n'est pas perceptible pour count = 5, cependant.dd
, semble-t-il, fera l'affaire.head -c
implémenter l'dd bs=5 count=1
approche a fonctionnétête :
Nom
head - affiche la première partie des fichiers
Synopsis
head [ OPTION ] ... [ FILE ] ...
La description
Imprimez les 10 premières lignes de chaque FICHIER sur la sortie standard. Avec plus d'un FICHIER, faites précéder chacun d'eux d'un en-tête donnant le nom du fichier. Sans FILE, ou lorsque FILE vaut -, lisez l'entrée standard.
Les arguments obligatoires pour les options longues sont également obligatoires pour les options courtes.
-c , --bytes = [-] N affiche les N premiers octets de chaque fichier; avec le début '-', affiche tous les octets sauf les N derniers de chaque fichier
la source
la tête ou la queue peuvent le faire aussi:
Imprime les X premiers octets (pas nécessairement des caractères s'il s'agit d'un fichier UTF-16) du fichier. tail fera de même, sauf pour les X derniers octets.
Ceci (et coupé) sont portables.
la source
ce script donne le nombre exact de caractères de la ligne et de l'emplacement spécifiques, par exemple:
donne les caractères de la ligne 5 et les caractères 5 à 8 de la ligne 5,
Remarque :
tail -1
permet de sélectionner la dernière ligne affichée par la tête.la source
vous pouvez également grep la ligne, puis la couper comme par exemple:
grep nom de fichier 'texte' | coupe -c 1-5
la source
Je sais que la réponse est en réponse à une question posée il y a 6 ans ...
Mais j'ai cherché quelque chose de similaire pendant quelques heures, puis j'ai découvert que: cut -c fait exactement cela, avec un bonus supplémentaire que vous pouvez également spécifier un décalage.
cut -c 1-5 retournera Hello et cut -c 7-11 retournera world . Pas besoin d'une autre commande
la source
Même si cela a été répondu / accepté il y a des années, la réponse actuellement acceptée n'est correcte que pour les encodages à un octet par caractère comme iso-8859-1, ou pour les sous-ensembles à un octet de jeux de caractères à octets variables (comme les caractères latins dans UTF-8). Même l'utilisation d'épissures multi-octets à la place ne fonctionnerait que pour les encodages multi-octets fixes comme UTF-16. Étant donné que maintenant UTF-8 est en passe de devenir une norme universelle, et lorsque vous examinez cette liste de langues par nombre de locuteurs natifs et cette liste des 30 principales langues par usage natif / secondaire , il est important de souligner un technique simple à octets variable (non basée sur les octets), utilisant
cut -c
ettr
/sed
avec des classes de caractères.Comparez ce qui suit qui échoue doublement en raison de deux erreurs / présomptions courantes centrées sur le latin concernant le problème des octets par rapport aux caractères (l'un est
head
contrecut
, l'autre est[a-z][A-Z]
contre[:upper:][:lower:]
):à ceci (note: cela a bien fonctionné sur FreeBSD, mais les deux
cut
ettr
sur GNU / Linux ont toujours mutilé le grec en UTF-8 pour moi cependant):Si vous
cut
ne gérez pas-c
correctement les encodages en octets variables, pour "les premiersX
caractères" (remplacez-lesX
par votre numéro), vous pouvez essayer:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- qui se limite cependant à la première lignehead -n 1 | grep -E -o '^.{X}'
- qui est limité à la première ligne et enchaîne cependant deux commandesdd
- qui a déjà été suggéré dans d'autres réponses, mais qui est vraiment encombrantsed
script compliqué avec un tampon de fenêtre coulissant pour gérer des caractères répartis sur plusieurs lignes, mais qui est probablement plus encombrant / fragile que d'utiliser simplement quelque chose commedd
Si votre
tr
ne gère pas correctement les classes de caractères avec des codages d'octets variables, vous pouvez essayer:sed -E -e 's/[[:upper:]]/\L&/g
(Spécifique à GNU)la source
printf 'Πού ' | cut -c 1
retourne juste du charabia ... ça se comporte comme 'head'Voici un script simple qui se termine en utilisant l'
dd
approche mentionnée ici:extract_chars.sh
la source