web-dev-qa-db-fra.com

Comment grep la dernière occurrence d'un motif de ligne

J'ai un fichier avec contenu

x
a
x
b
x
c

Je veux saluer la dernière occurrence,

x
c

quand j'essaye

sed -n  "/x/,/b/p" file

il répertorie toutes les lignes, commençant de x à c.

17
user3702858

Je ne sais pas si j'ai bien répondu à votre question, alors voici quelques clichés dans le noir:

  • Imprimer la dernière occurrence de x (regex):

    grep x file | tail -1
    
  • Alternativement:

    tac file | grep -m1 x
    
  • Imprimer le fichier de la première ligne correspondante à la fin:

    awk '/x/{flag = 1}; flag' file
    
  • Imprimer le fichier de la dernière ligne correspondante à la fin (imprime toutes les lignes en cas de non correspondance):

    tac file | awk '!flag; /x/{flag = 1};' | tac
    
36
steffen

Cela pourrait fonctionner pour vous (GNU sed):

sed '/x/h;//!H;$!d;x' file

Enregistre le dernier x et ce qui suit dans l'espace d'attente et l'imprime à la fin du fichier.

3
potong

je ne sais pas comment le faire en utilisant sed, mais vous pouvez essayer awk

awk '{a=a"\n"$0; if ($0 == "x"){ a=$0}}  END{print a}' file
1
ray
grep -A 1 x file | tail -n 2

-A 1 indique à grep d'imprimer une ligne après une ligne de correspondance
avec tail vous obtenez les deux dernières lignes.

ou de manière inversée:

tac fail | grep -B 1 x -m1 | tac

Remarque: vous devez vous assurer que votre motif est suffisamment "solide" pour qu'il vous donne les bonnes lignes. c'est-à-dire en le joignant à ^ au début et $ à la fin.

1
elig