113 votes

Comment afficher certaines lignes d'un fichier texte sous Linux ?

Je suppose que tout le monde connaît les utilitaires utiles de la ligne de commande de Linux. head y tail . head permet d'imprimer les X premières lignes d'un fichier, tail fait la même chose mais imprime la fin du fichier. Quelle est une bonne commande pour imprimer le milieu d'un fichier ? quelque chose comme middle --start 10000000 --count 20 (imprimer les 10'000'000ème à 10'000'010ème lignes).

Je cherche quelque chose qui puisse traiter efficacement les gros fichiers. J'ai essayé tail -n 10000000 | head 10 et c'est horriblement lent.

147voto

jason saldo Points 5036
sed -n '10000000,10000020p' filename

Vous pourriez accélérer un peu le processus comme ceci :

sed -n '10000000,10000020p; 10000021q' filename

Dans ces commandes, l'option -n causes sed pour "supprimer l'impression automatique de l'espace des motifs". Le site p "imprime l'espace du motif actuel" et la commande q commande "Quitte immédiatement le script sed script sans traiter aucune autre entrée..." Les guillemets sont issus de la sed man page .

Au fait, votre commande

tail -n 10000000 filename | head 10

commence à la dix millionième ligne de la fin du fichier, alors que votre commande "du milieu" semble commencer à la dix millionième à partir de la première ligne du fichier. débutant ce qui serait équivalent à :

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, alors vous pouvez rechercher dans le fichier sur la base d'une position d'octet. Dans l'exemple du fichier journal, vous pourriez effectuer une recherche binaire pour une plage de temps comme mon script Python aquí * fait. Dans le cas du fichier à longueur d'enregistrement fixe, c'est très simple. Il suffit de chercher linelength * linecount dans le fichier.

* Je continue à vouloir poster une autre mise à jour de ce script. Peut-être que je vais y arriver un de ces jours.

43voto

Dox Points 441

J'ai découvert l'utilisation suivante de sed

sed -n '10000000,+20p'  filename

J'espère que cela sera utile à quelqu'un !

7voto

Dennis Points 51

C'est la première fois que je poste ici ! Quoi qu'il en soit, celui-ci est facile. Disons que vous voulez extraire la ligne 8872 de votre fichier appelé file.txt. Voici comment faire :

cat -n file.txt | grep '^ *8872'

Maintenant la question est de trouver 20 lignes après cela. Pour cela, il faut

cat -n fichier.txt | grep -A 20 '^ *8872'

Pour les lignes autour ou avant, voir les drapeaux -B et -C dans le manuel grep.

2voto

newbie13 Points 121

Utilisez la commande suivante pour obtenir la gamme particulière de lignes

awk 'NR < 1220974{next}1;NR==1513793{exit}' debug.log | tee -a test.log

Ici debug.log est mon fichier qui se compose d'un manque de lignes et j'ai utilisé pour imprimer les lignes de 1220974 numéro de ligne à 1513793 à un fichier test.log. J'espère que cela sera utile pour capturer la gamme de lignes.

2voto

Peter V. Mørch Points 732

Perl est le roi :

perl -ne 'print if ($. == 10000000 .. $. == 10000020)' filename

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X