我的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
答案 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。