2009-07-14 6 views
2

J'ai une simple commande grep qui retourne les lignes qui correspondent à partir d'un fichier. Voici le problème: Parfois, quand une ligne correspond, je veux inclure la ligne avant elle. Ce que je veux est un moyen de trouver toutes les lignes qui correspondent à un modèle, puis utilisez un modèle différent pour voir si la ligne avant chaque résultat correspond. Disons que je veux obtenir toutes les lignes contenant 'bar', et la ligne avant chacune d'elles seulement si elles contiennent 'foo'. Compte tenu d'une entrée comme ceci:Grep (ou peut-être regex) vérifier le motif sur les lignes avant ou après un match

 
    Spam spam eggs eggs 
    Let's all go to the bar. 
    Blah Blah Blah foo. 
    Meh. 
    foo foo foo 
    Yippie, a bar. 

Je voudrais un résultat comme celui-ci:

 
    Let's all go to the bar 
    foo foo foo 
    Yippie, a bar. 

Répondre

9

Vous pouvez utiliser l'option -B pour inclure les lignes de contexte avant le match (il y a aussi -A pour inclure les lignes de contexte après, et -C pour inclure les lignes de contexte avant et après). Vous pouvez ensuite conduit le résultat dans une autre grep:

# Get all lines matching 'bar' and include one line of context before each match 
# Then, keep only lines matching 'bar' or 'foo' 
grep bar -B1 the-file | grep 'bar\|foo' 
0

ne pas utiliser grep 2 fois

awk '/bar/ && p~/foo/{ 
    print p 
    print 
    next 
}/bar/{print}{ p=$0}' file 
Questions connexes