Je veux localiser une date quelque part dans un journal de 8 Go (texte).
Puis-je contourner une lecture séquentielle complète et faire d'abord des séparations binaires du fichier (taille), ou en quelque sorte naviguer dans le système de fichiers inodes
(que je connais très peu), pour commencer la lecture à partir de chaque point de partage, jusqu'à ce que je trouve un décalage approprié à partir de où commencer ma recherche de texte pour une ligne contenant la date?
tail
La lecture de la dernière ligne n'utilise pas une lecture séquentielle normale, donc je me demande si cette fonctionnalité est en quelque sorte disponible en bash, ou aurais-je besoin d'utiliser Python ou C / C ++ ... mais je suis spécifiquement intéressé par une bash
option ..
la source
Réponses:
qui .. ne crée aucun fichier à division temporaire, ignore les blocs * 512 Mo de données à chaque exécution, lit 64 octets à partir de cette position et limite la sortie à la première ligne de ces 64 octets.
vous voudrez peut-être ajuster 64 à tout ce dont vous pensez avoir besoin.
la source
dd
pour ça aussi ... C'est un excellent outil! :)Cela ressemble à ce que vous voulez:
ou quel que soit le nombre d'octets que vous souhaitez ignorer. Le signe plus indique à tail de mesurer depuis le début du fichier au lieu de la fin. Si vous utilisez la version GNU de tail, vous pouvez l'écrire comme suit:
Pour obtenir un nombre fixe d'octets après la coupe, au lieu de tout le reste du fichier, il suffit de le diriger à travers head:
la source
dd
saute à un octet spécifique (comme le faittail
), mais c'est une douleur codant autour de longueurs de ligne inconnues, puis un appel à sed pour supprimer les lignes partielles principales ... Il semble que tail | head puisse faire cela sans douleur (aussi vite?) . Je ne comprends pas comment la tête peut fermer le robinet sur la queue, mais il semble que ce soit :) Il doit s'agir de: Si la tête cesse de recevoir, la queue cesse d'envoyer (et arrête la lecture). Doit y retourner .. demain.tail
/head
ne sont pas en mesure de deviner les longueurs de ligne également. vous devez sauter à la position x, puis vous pouvez regarder à gauche ou à droite de x pour le suivant\n
. peu importe le nom du programme. ainsi, dans les deux cas, vous passez à x, puis utilisezhead
pour regarder vers la droite la fin de ligne suivante.tail|head
offre la possibilité de ne pas se soucier du tout dedd
count = val. Avec 'dd', si je ne récupère pas assez de données, c'est "game over". La flexibilité des longueurs de ligne arbitraires est grande. J'ai écrit une fonction pour 'dd' qui retourne la ligne complète "la plus proche" et son décalage, mais je préfère éviter le problème de longueur. J'ai maintenant testé tail | head, et il fonctionne initialement bien (à offset = 100 Mo), mais ralentit considérablement pour prendre 2 min pour un accès à offset = 8 Go (je peux leawk
faire en 1 min) ... donc c'est génial pour les fichiers plus petits .. Merci de m'avoir informé du combo queue / tête :)J'essaierais quelque chose comme ça pour diviser le journal en morceaux de 512 Mo pour une analyse plus rapide.
Si vous recherchez le fichier, les éléments suivants fonctionneraient:
Utilisez cette sortie pour déterminer quel fichier grep pour votre date.
la source
Voici mon script, je recherche la première ligne où le premier champ correspond à mon numéro. Les lignes sont triées selon le premier champ. J'utilise dd pour vérifier la première ligne de blocs de 128 Ko, puis je passe au bloc et j'effectue une recherche. Il améliore l'efficacité si le fichier dépasse 1M.
Tout commentaire ou correction est apprécié!
* EDIT * ** grep est beaucoup plus rapide et ack encore meilleur
la source