2010-08-18 12 views
2

Ma requête SQL ressemble à ceci ...mots avant et après le texte sélectionné

sekect * FROM mail_headers LEFT JOIN mail_headers_body b = ON a.mailid b.id bla bla bla

Je peux sélectionner les lignes avant et après le résultat, en utilisant les commutateurs -A, -B. Mais comment puis-je trouver les 4 mots avant et après le texte sélectionné?

grep -i 'JOIN mail_headers_body' mysql-gen.log 

Cela renverra la requête mentionnée ci-dessus. Mais ce que je veux savoir, c'est 4 «mots» avant le texte sélectionné. à savoir

FROM mail_headers a LEFT 

et 4 (ou 5) mots après ...

b ON a.mailid=b.id blah 

Répondre

2

Essayez ceci:

grep -Eio '(*[^ ]* *){4}JOIN mail_headers_body(*[^ ]* *){4}' 

Il devrait vous donner cette sortie:

FROM mail_headers a LEFT JOIN mail_headers_body b ON a.mailid=b.id blah 
+0

J'ai supprimé l'option -i car les noms de mes tables sont sensibles à la casse. J'ai essayé d'ajouter l'option -w parce que je veux sélectionner uniquement le mot spécifique. # pourquoi la table mail_headers_body_sent apparaît-elle? Je cherche seulement la table mentionnée ci-dessus. – shantanuo

+0

a ajouté le mot frontière comme # \ shantanuo

+0

Très propre, très agréable. Bien joué! +1 –

0

vous pouvez utiliser awk,

$ echo $sql|awk -F"JOIN mail_headers_body" '{ 
    m=split($1,a," ");n=split($2,b," ") 
    print a[m-3],a[m-2],a[m-1],a[m]; print b[1],b[2],b[3],b[4] }' 

ceci suppose que vous avez seulement 1 "JOIN mail_headers_body". Sinon, utilisez une boucle for pour itérer les champs.

+0

# Si je le change en suivant, il affiche $ mytable tel quel, et non le nom réel de la table. # cat mysql-gen.log | awk -vRS = "$ mytable" 'NR == 1 {pour (i = NF-3; i <= NF; i ++) print "$ mytable" $ i}' # J'essaie d'utiliser cette instruction dans un script shell. – shantanuo

+0

car vous ne passez pas correctement la variable shell à awk. utilisez -v. 'awk -vRS =" $ mytable "-v montable =" $ mytable "'{.... print mytable" "$ i}'' – ghostdog74

+0

Renvoie-t-il toutes les instances? dans mon cas, il ne renvoie que la première ligne qu'il trouve. – shantanuo

0

Voici le AWK, GREP, et les combinaisons de CAT dans un one-liner:

cat YOURFILE | grep -i 'JOIN mail_headers_body' | awk '{ for(i;i<=NF;i++){ if($i ~ /JOIN/) { a = i } } for(x=4;x!=0;x--){ before=before" "$(a-x)} a+=3; for(x=0;x<4;x++) { after=after" "$(a+x) } print "BEFORE: "before" \nAFTER: "after }' 

mise à jour: je viens de supprimer a--; de l'awk. Je me suis juste rendu compte qu'il sautait le premier mot avant JOIN qui est gauche.

+0

Plus de 4 mots sont retournés avant et après – shantanuo

+0

Sur la base de la requête que vous présentez dans votre post, je reçois le dos suivant: AVANT: * FROM mail_headers un APRÈS: BMARCHE a.mailid = b. id blah C'est 4 mots. Un mot est défini comme un groupe de caractères avec un espace des deux côtés. Donc a.mailid = b.id est un mot. –

+0

Après la mise à jour (en supprimant le a--;), il retourne maintenant ce qui suit. AVANT: FROM mail_headers a GAUCHE APRÈS: ON a.mailid = b.id blah blah –

Questions connexes