【问题标题】:GREP by result of awk通过 awk 的结果进行 GREP
【发布时间】:2017-11-15 05:16:27
【问题描述】:

awk '{print $4}' 的输出是

b05808aa-c6ad-4d30-a334-198ff5726f7c
59996d37-9008-4b3b-ab22-340955cb6019
2b41f358-ff6d-418c-a0d3-ac7151c03b78
7ac4995c-ff2c-4717-a2ac-e6870a5670f0

我需要通过这些记录 grep 文件 st.log。 awk '{print $4}' |xargs -i grep -w "pattern from awk" st.log 我不知道如何正确传递模式?

【问题讨论】:

  • 为什么不能只使用 awk?
  • st.log的结构是什么?一些有代表性的样本行会有所帮助。如果 GUID 始终位于特定字段中,那么 awk 脚本可能会更高效。
  • edit 你的问题包括minimal reproducible example 简洁、可测试的样本输入和预期输出,所以我们不会猜测你在寻求帮助。现在我们甚至不知道您是否在 st.log 上运行 awk 命令,与您的 grep 命令相同,或者其他对潜在解决方案有很大影响的东西。我们也不知道您的文件是 Terrabytes 还是 10 行,这也会产生影响。您的问题在书面上非常不清楚,不适合我们帮助您想出一个好的解决方案。
  • 把你的过滤器放在awk,这样一开始就只打印请求的元素。以awk '$4 ~ /^b/ {print $4} 为例。

标签: bash awk grep


【解决方案1】:

怎么样

awk '{print $4}' | grep -F -f - st.log

感谢 Eric Renouf,他注意到 -f - 可以用于标准输入,而不是 -f <(cat),注意:-f /dev/stdin 也可以工作,并且避免启动新进程。

或更接近问题以对输出进行排序

awk '{print $4}' | xargs -i grep -F {} st.log 

也许 -w 不是 OP 需要的选项,而是 -F

grep --help
-F, --fixed-strings       PATTERN is a set of newline-separated strings
-w, --word-regexp         force PATTERN to match only whole words

-w 将只匹配包含完全模式的行

例子

grep -w . <<<a       # matches
grep -w . <<<ab      # doesn't match
grep -F . <<<a       # doesn't match
grep -F . <<<a.b     # matches

【讨论】:

  • 除了 Ed 所说的,你也不需要在这里使用进程替换,grep -w -f - st.log 会在没有 cat 的情况下从标准输入读取模式
  • @EdMorton:我不同意,使用 awk、grep 和 sed 是简单的流水线操作,否则可以使用 perl 等更强大的语言
  • @TomFenech 但是如果它正在读取awk 的输出,就像这里一样,你已经明白了。我只是说grep -f -grep -f &lt;(cat) 容易
  • @EricRenouf 我之前尝试过你的建议,但没有成功
  • @NahuelFouilleul awk '{print $4}' | grep -w -f - st.log 不起作用?没用怎么办?
【解决方案2】:

这些方面可能会有所帮助

How to process each line received as a result of grep command

awk '{print $4} | while read -r line; do 
    grep $line st.log
done

【讨论】:

猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多