Слова до и после выделенного текста - PullRequest
2 голосов
/ 18 августа 2010

Мой SQL-запрос выглядит так ...

sekect * FROM mail_headers a LEFT JOIN mail_headers_body b ON a.mailid = b.id бла-бла-бла

Я могу выбрать строки до и после результата, используя ключи -A, -B. Но как мне найти 4 слова до и после выделенного текста?

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

Это вернет запрос, упомянутый выше. Но то, что я хочу знать, это 4 слова перед выбранным текстом. т.е.

FROM mail_headers a LEFT

И 4 (или 5) слова после ...

b ON a.mailid=b.id blah

Ответы [ 3 ]

2 голосов
/ 18 августа 2010

Попробуйте:

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

Это должно дать вам такой вывод:

 FROM mail_headers a LEFT JOIN mail_headers_body b ON a.mailid=b.id blah
0 голосов
/ 18 августа 2010

Вот комбинации AWK, GREP и CAT в одной строке:

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

update: я только что удалил a--;из awk.Я только что понял, что пропустил первое слово перед JOIN, которое осталось.

0 голосов
/ 18 августа 2010

вы можете использовать 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] }'

это предполагает, что у вас есть только 1 "JOIN mail_headers_body". В противном случае используйте цикл for для итерации полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...