Solution 1 :
sed -n '10000000,10000020p' filename
Vous pourrez peut-être accélérer un peu comme ceci :
sed -n '10000000,10000020p; 10000021q' filename
Dans ces commandes, l'option -n
provoque sed
pour "supprimer l'impression automatique de l'espace du motif". Le p
commande "print[s] the current pattern space" et le q
commande "Quitter immédiatement le script sed sans traiter d'autre entrée..." Les guillemets proviennent du sed
man
page.
Au fait, votre commande
tail -n 10000000 filename | head 10
commence à la dix millionième ligne à partir de la fin du fichier, alors que votre commande "milieu" semblerait commencer au dix millionième depuis le début ce qui équivaudrait à :
head -n 10000010 filename | tail 10
Le problème est que pour les fichiers non triés avec des lignes de longueur variable, tout processus devra parcourir le fichier en comptant les nouvelles lignes. Il n'y a aucun moyen de raccourcir cela.
Si, toutefois, le fichier est trié (un fichier journal avec des horodatages, par exemple) ou a des lignes de longueur fixe, vous pouvez rechercher dans le fichier en fonction d'une position d'octet. Dans l'exemple de fichier journal, vous pouvez effectuer une recherche binaire pour une plage de temps comme le fait mon script Python ici*. Dans le cas du fichier à longueur d'enregistrement fixe, c'est très simple. Vous cherchez juste linelength * linecount
caractères dans le fichier.
Solution 2 :
J'ai découvert l'utilisation suivante de sed
sed -n '10000000,+20p' filename
J'espère que c'est utile à quelqu'un !
Solution 3 :
C'est la première fois que je publie ici! Quoi qu'il en soit, celui-ci est facile. Supposons que vous souhaitiez extraire la ligne 8872 de votre fichier appelé file.txt. Voici comment procéder :
chat -n fichier.txt | grep '^ *8872'
Maintenant, la question est de trouver 20 lignes après cela. Pour ce faire, vous faites
chat -n fichier.txt | grep -A 20 '^ *8872'
Pour les lignes autour ou avant, voir les drapeaux -B et -C dans le manuel de grep.