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

发布于 2024-09-15 04:50:53 字数 438 浏览 4 评论 0原文

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

sekect * FROM mail_headers 左连接 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

My SQL query looks like this...

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

I can select the lines before and after the result, using -A, -B switches. But how do I find the 4 words before and after the selected text?

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

This will return the query mentioned above. But what I want to know is 4 "words" before the selected text. i.e.

FROM mail_headers a LEFT

And 4 (or 5) words after...

b ON a.mailid=b.id blah

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月静好 2024-09-22 04:50:53

试试这个:

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

它应该给你这个输出:

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

Try this:

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

It should give you this output:

 FROM mail_headers a LEFT JOIN mail_headers_body b ON a.mailid=b.id blah
南城追梦 2024-09-22 04:50:53

以下是 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。

Here is the AWK, GREP, and CAT combinations in a 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  }'

update: I just removed a--; from the awk. I just realized it was skipping the first word before JOIN which is LEFT.

又爬满兰若 2024-09-22 04:50:53

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

you can use 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] }'

this is assuming you have only 1 "JOIN mail_headers_body". Otherwise, use a for loop to iterate the fields.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文