所选文字之前和之后的单词

时间:2010-08-18 04:37:11

标签: shell sed awk

我的SQL查询看起来像这样......

  

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

我可以使用-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 个答案:

答案 0 :(得分:2)

试试这个:

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

它应该给你这个输出:

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

答案 1 :(得分:0)

你可以使用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循环迭代字段。

答案 2 :(得分:0)

以下是单行中的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  }'

更新:我刚删除了一个 - ;从awk。我刚刚意识到它正在跳过JOIN之前的第一个单词,即LEFT。