risposta-alla-domanda-sullo-sviluppo-web-bd.com

Linux testa/coda con offset

C'è un modo in Linux per chiedere la testa o la coda, ma con un offset aggiuntivo di record da ignorare.

Ad esempio se il file example.lst contiene quanto segue:

row01
row02
row03
row04
row05

E io uso head -n3 example.lst Posso ottenere le righe 1 - 3 ma cosa succede se voglio saltare la prima riga e ottenere le righe 2 - 4?

Chiedo perché alcuni comandi hanno un'intestazione che potrebbe non essere desiderabile nei risultati della ricerca. Ad esempio, du -h ~ --max-depth 1 | sort -rh restituirà la dimensione della directory di tutte le cartelle all'interno della directory home ordinate in ordine discendente, ma aggiungerà la directory corrente all'inizio del set di risultati (ad esempio ~).

Le pagine man Head and Tail non sembrano avere alcun parametro di offset, quindi forse esiste una sorta di comando range in cui è possibile specificare le linee richieste: ad es. range 2-10 o qualcosa del genere?

18
hash-bang

Da 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

È quindi possibile utilizzare ... | tail -n +2 | head -n 3 per ottenere 3 righe a partire dalla riga 2.

I metodi non-head/tail includono sed -n "2,4p" e awk "NR >= 2 && NR <= 4".

37
that other guy

Per ottenere le righe tra 2 e 4 (entrambe incluse), puoi utilizzare:

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

o

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

Ci è voluto molto tempo per finire con questa soluzione che, sembra essere l'unica che ha coperto tutti gli scenari (finora):

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]}
           }'

Elenco delle caratteristiche:

  • uscita live per head (ovviamente quella per tail non è possibile)
  • nessun uso di file esterni
  • barra di avanzamento su stderr, un punto per ogni riga dopo MAX_LINES, molto utile per le attività di lunga durata.
  • evita possibili ordini di registrazione errati a causa del buffering (stdbuf)
0
sorin