émuler la queue avec sed


8

J'ai un mini-système avec un nombre limité seulement de binaires ( bash, cp, cat, sed, ...). Je n'ai pas de tailcommande, et je me demande si je pourrais émuler la fonctionnalité de queue avecsed

cat foo.txt | tail -n 10

Je sais que je peux imprimer les lignes 1 à 10 avec sed cat foo.txt | sed -n '1,10p', mais comment imprimer les 10 dernières lignes?


2
Il existe de nombreux scripts sed utiles sur une seule ligne de commande dont vous pourriez avoir besoin: sed one-line
Slyx

Réponses:


15

Vous pourriez faire quelque chose comme ça:

sed -e :a -e '$q;N;11,$D;ba'

sed -e :a -e '$q;N;11,$D;ba' foopour correspondre à la question.
Slyx

Je ne sais pas comment cela fonctionne, mais cela fonctionne parfaitement. Merci beaucoup.
Martin Vegter

Quelqu'un pourrait-il expliquer cette merveilleuse commande? Je cherche à avoir une commande qui montre le début et la fin d'un document, et je pense que cette commande pourrait aider, mais je dois ajouter la partie tête. En fait, la commande que je cherchais est simplement: sed -e '1,11p' -e :a -e '$q;N;11,$D;ba' Mais j'aimerais quand même comprendre la partie queue !!!
Franck

0
tac foo |  sed -n '1,10p' | tac

mais si vous n'avez pas de tac, vous ne pouvez utiliser que sed de cette façon:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'

0

Est exprdisponible avec votre système? Ensuite, vous pouvez essayer d'évaluer le numéro de ligne souhaité après avoir compté le nombre total de lignes dans le fichier.

J'ai créé un fichier nommé tmpcontenant les numéros de 1 à 20 dans chaque ligne.

nlines=$(cat tmp | sed -n '$=')
cat tmp | sed -n $(expr $nlines - 9),"$nlines"p
11
12
13
14
15
16
17
18
19
20

Bien sûr, vous pouvez utiliser wc -l, si disponible.

La commande pour calculer le nombre total de lignes dans le fichier provient des lignes sed one . Cependant, je n'ai pas vérifié si cela fonctionne aussi avec des fichiers vides.

PS Si exprn'est pas disponible, vous pouvez utiliser des nombres soustraits dans Bash comme indiqué ci-dessous:

cat tmp | sed -n $((nlines-9)),"$nlines"p
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.