代码之家  ›  专栏  ›  技术社区  ›  Rebourn

通过tail对多个文件进行grep

  •  2
  • Rebourn  · 技术社区  · 10 年前

    尝试从多个文件中grep一个短语,因为它们经常被填充(日志),但会提示使用该短语更新了哪个文件。

    例如:

    grep bindaddr /vservers/*/var/log 
    

    让我:

    /vservers/11010/var/log:bindaddr=xxx.xxx.xxx.xxx
    /vservers/12525/var/log:bindaddr=xxx.xxx.xxx.xxx
    /vservers/12593/var/log:bindaddr=xxx.xxx.xxx.xxx
    

    这很酷,但我需要这个做尾翼。

    tail -fn 100 /vservers/*/var/log | grep bindaddr 
    

    给我所需的行,但在哪个文件中没有指示符,所以我需要两者的混合。

    3 回复  |  直到 10 年前
        1
  •  4
  •   fedorqui    10 年前

    如果您使用 -v 在里面 tail ,您将获得详细模式:从 man tab -->“始终输出提供文件名的标头”。这样,每当文件中发生任何事情时,您都会在前一行获得标题。

    与此一起,您可以使用 grep -B1 显示匹配+上一行。

    总之,这应该做到:

    tail -fvn 100 /vservers/*/var/log | grep -B1 bindaddr
    

    测验

    在一个选项卡中执行此操作:

    $ echo "hi" >> a2
    $ echo "hi" >> a2
    $ echo "hi" >> a1
    $ echo "hi" >> a2
    

    我在另一张上看到了这个:

    $ tail -vfn 100 /tmp/a* | grep -B1 "h"
    ==> /tmp/a1 <==
    
    ==> /tmp/a2 <==
    hi
    hi
    
    ==> /tmp/a1 <==
    hi
    
    ==> /tmp/a2 <==
    hi
    
        2
  •  0
  •   Mark Setchell    10 年前

    类似于这样,将文件名放在 tail :

    #!/bin/bash
    # Arrange to kill all descendants on exit/interrupt
    trap "kill 0" SIGINT SIGTERM EXIT
    for f in *.txt; do
        tail -f "$f" | sed "s/^/"$f": /" > /dev/tty &
    done
    # grep in stdin (i.e. /dev/tty)
    grep bina -
    
        3
  •  0
  •   cgnorthcutt zwol    4 年前

    我想有些人会来这篇文章,寻找一种方法来显示文件名,同时隐藏多个文件的尾部:

    for f in path/to/files*.txt; do echo $f; tail $f | grep 'SEARCH-THIS';  done;
    

    这将显示如下输出

    filename1.txt
     search result 1
     search result 2
    
    filenam2.txt
     search result 3
     search result 4
    
    ...