Vous pourrez obtenir beaucoup de rapidité en choisissant une grepexpression judicieuse ... L'évaluation des jokers de longueur inconnue (du type a.*thing) prendra beaucoup plus de temps. Il se peut que vous optimisiez pour la mauvaise chose (même s’il n’est jamais inutile de chercher dans une partie seulement du fichier, cela n’est évidemment pas la meilleure source d’accélération).
Floris
Réponses:
75
Je suppose que vous pouvez utiliser tail pour n’émettre que les 4 derniers Go environ en utilisant le -ccommutateur
-c, --bytes = [+] NUM
afficher les derniers NUM octets. ou utilisez -c + NUM pour générer en commençant par l'octet NUM de chaque fichier
Vous pouvez probablement faire quelque chose avec dd aussi en réglant bs=1et en skipajustant le décalage que vous voulez commencer, par exemple
@ Rogier S'il vous plaît ajouter une réponse avec la solution au lieu de l'ajouter à votre question. Ceci est similaire à la réponse de soi: serverfault.com/help/self-answer
AL le
5
@istheEnglishway: Eh bien, non, ils ont posté une commande différente.
Courses de légèreté avec Monica le
11
Mais votre réponse ne fournit pas la commande qui implémente cette solution, qui est une valeur ajoutée. Vous pouvez l'éditer dans votre réponse ou le PO le poster comme nouvelle réponse. Ils ne devraient certainement pas ajouter cela à la question, qui est ce qui s'est passé. Et vous ne devriez certainement pas lancer des épithètes comme "fourrer votre nez dans".
Courses de légèreté avec Monica le
7
@istheEnglishway, croyez-le ou ne pas avoir un exemple simplifie les choses plutôt que d'avoir à lire une page de manuel (voir aussi: la documentation de stackoverflow)
Pierre.Sassoulas Le
32
Je ne fais que poster ceci parce que certains commentaires l'ont demandé.
Ce que je finis par utiliser était (fichier de 15 Go). Cela a fonctionné très vite et m'a fait gagner beaucoup de temps.
tail -f -c 14G file | grep something
J'ai également fait un repère très rudimentaire sur le même dossier. J'ai testé:
fichier grep xxx
// pris à jamais (> 5 minutes)
dd if = fichier bs = 1 skip = 14G | grep xxx
// très rapide <1 sec
queue -c 14g | grep xxx
// assez rapide <2 sec
le tailest juste un peu plus court.
NB: le suffixe utilisé get Gdiffère par commande (Ubuntu 15.10)
Avez-vous effacé le cache disque entre les tests? Je soupçonne que la plupart du temps dans le premier cas était I / O. L'accélération devrait être de l'ordre de 15 ×, pas 300 ×.
Reid
2
@Rid je ne l'ai pas fait. Mais j'ai exécuté chaque commande plusieurs fois. Je suis presque sûr que dd ou tail augmentera la vitesse de manière significative par rapport à grep (cache ou non).
Roger
19
Cela ne répond pas à la question sur le titre, mais fera ce que vous voulez faire. Utilisez tac pour inverser le fichier, puis utilisez grep pour rechercher votre chaîne. Si votre chaîne n'apparaît qu'une fois ou un nombre de fois connu dans le fichier, laissez-la s'exécuter jusqu'à ce qu'elle trouve le nombre connu d'occurrences. De cette manière, si votre hypothèse sur l'emplacement du fichier est incorrecte, elle le trouvera toujours. Si vous voulez le limiter, vous pouvez utiliser head pour le faire. La commande principale irait entre le tac et le grep.
Je suis venu ici pour écrire exactement la même réponse. Je suis surpris que personne n'ait voté pour le vôtre.
Dmitry Grigoryev
2
Ça m'a pris une minute, mais ensuite j'ai gémi au jeu de mots ... c'est le contraire du chat.
Sammi
1
J'avais besoin de fouiller dans un journal d'application / de débogage . Parce qu'il inverse les lignes, sa lecture ne devient pas plus facile ;-) Cela semble toutefois très rapide. Jamais vu tac, alors merci!
LC_ALL=C grep
peut accélérer.grep
expression judicieuse ... L'évaluation des jokers de longueur inconnue (du typea.*thing
) prendra beaucoup plus de temps. Il se peut que vous optimisiez pour la mauvaise chose (même s’il n’est jamais inutile de chercher dans une partie seulement du fichier, cela n’est évidemment pas la meilleure source d’accélération).Réponses:
Je suppose que vous pouvez utiliser tail pour n’émettre que les 4 derniers Go environ en utilisant le
-c
commutateurVous pouvez probablement faire quelque chose avec dd aussi en réglant
bs=1
et enskip
ajustant le décalage que vous voulez commencer, par exemplela source
Je ne fais que poster ceci parce que certains commentaires l'ont demandé.
Ce que je finis par utiliser était (fichier de 15 Go). Cela a fonctionné très vite et m'a fait gagner beaucoup de temps.
J'ai également fait un repère très rudimentaire sur le même dossier. J'ai testé:
le
tail
est juste un peu plus court.NB: le suffixe utilisé
g
etG
diffère par commande (Ubuntu 15.10)la source
Cela ne répond pas à la question sur le titre, mais fera ce que vous voulez faire. Utilisez tac pour inverser le fichier, puis utilisez grep pour rechercher votre chaîne. Si votre chaîne n'apparaît qu'une fois ou un nombre de fois connu dans le fichier, laissez-la s'exécuter jusqu'à ce qu'elle trouve le nombre connu d'occurrences. De cette manière, si votre hypothèse sur l'emplacement du fichier est incorrecte, elle le trouvera toujours. Si vous voulez le limiter, vous pouvez utiliser head pour le faire. La commande principale irait entre le tac et le grep.
Donc, la commande ressemble à:
la source
tac
, alors merci!