【问题标题】:Building grep strings dynamically动态构建 grep 字符串
【发布时间】:2010-11-08 23:34:26
【问题描述】:

我正在编写一个 shell 脚本来对不断增长的日志文件进行“跟踪”。此脚本接受要搜索的参数,并在其上逐步 greps 输出。

例如,如果脚本调用如下:

logs.sh string1 string2

应该翻译成:

tail -f logs.txt | grep string1 | grep string2

我正在构建这样的 grep 字符串列表:

full_grep_string=""
for grep_string in $*
do
    full_grep_string="$full_grep_string | grep $grep_string" 
done

字符串是正确构建的,但是当我尝试最终将它标记到tail命令时,就像这样......

tail -f $LOG_FILE_PATH $full_grep_string

...grep 不适用,我得到未过滤的日志。

我在这里遗漏了什么吗?或者有更简单的方法吗?

【问题讨论】:

  • 只是一个小小的说明:您的脚本应该输出包含 string1 和 string2 的日志文件行的想法,还是您打算查找包含任何字符串的行?
  • 另外,您使用的是什么外壳?重击?
  • 对于 debian lenny 的我来说,我必须面对两个 grep 组合不能与 tail -f 一起使用但仅与 tail 一起使用的问题
  • @Andreas:我建议他想同时找到这两个,否则组合的 grep 没有用,他可以使用 egrep "string1|string2"

标签: linux shell grep tail


【解决方案1】:
eval tail -f $LOG_FILE_PATH $full_grep_string

【讨论】:

    【解决方案2】:

    grep 缓冲它找到的行。所以将你的代码修改为

    full_grep_string="$full_grep_string | grep --line-buffered $grep_string" 
    

    应该工作。我在 debian lenny(使用 bash)上对其进行了测试。

    并使用an0的尖端

    eval tail -f ...
    

    (所有这些都适用于整个单词)

    【讨论】:

    • 感谢您的提示.. 但看起来我的 grep 版本太旧了,无法接受完整的单词参数。顺便说一句,我正在 SunOS 5.8 盒子上进行测试。很老的软件。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2016-09-05
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多