web-dev-qa-db-fra.com

Tête/queue Linux avec offset

Existe-t-il un moyen sous Linux de demander l’en-tête ou la queue mais avec un décalage supplémentaire des enregistrements à ignorer?.

Par exemple, si le fichier example.lst contient les éléments suivants:

row01
row02
row03
row04
row05

Et j'utilise head -n3 example.lst je peux obtenir les lignes 1 à 3, mais que se passe-t-il si je souhaite ignorer la première ligne et obtenir les lignes 2 à 4?

Je demande parce que certaines commandes ont un en-tête qui peut ne pas être souhaitable dans les résultats de la recherche. Par exemple, du -h ~ --max-depth 1 | sort -rh renverra la taille du répertoire de tous les dossiers du répertoire de base, triés par ordre décroissant, mais ajoutera le répertoire en cours en haut du jeu de résultats (c'est-à-dire ~).

Les pages de manuel Head et Tail ne semblent pas avoir de paramètre offset, alors il existe peut-être une sorte de commande range dans laquelle les lignes requises peuvent être spécifiées: par exemple. range 2-10 ou quelque chose?

18
hash-bang

De man tail:

   -n, --lines=K
        output the last K lines, instead of the last 10; 
        or use -n +K to output lines starting with the Kth

Vous pouvez donc utiliser ... | tail -n +2 | head -n 3 pour obtenir 3 lignes à partir de la ligne 2.

Les méthodes autres que head/tail incluent sed -n "2,4p" et awk "NR >= 2 && NR <= 4".

37
that other guy

Pour obtenir les lignes entre 2 et 4 (les deux inclus), vous pouvez utiliser:

head -n4 example.lst | tail -n+2

ou

head -n4 example.lst | tail -n3
4
Farahmand

Il a fallu beaucoup de temps pour arriver à cette solution qui semble être la seule à couvrir tous les cas d'utilisation (jusqu'à présent):

command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
          '{
               if (NR <= offset) print;
               else {
                   a[NR] = $0;
                   delete a[NR-offset];
                   printf "." > "/dev/stderr"
                   }
           }
           END {
             print "" > "/dev/stderr";
             for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
             { print a[i]}
           }'

Liste des fonctionnalités:

  • sortie en direct pour la tête (évidemment que pour la queue n'est pas possible)
  • pas d'utilisation de fichiers externes
  • progressbar sur stderr, un point pour chaque ligne après MAX_LINES, très utile pour les tâches de longue durée.
  • évite un possible ordre de journalisation incorrect en raison de la mise en mémoire tampon (stdbuf)
0
sorin