linux 如何在“file-with-patterns”频繁更改的管道中使用“grep -f file-with-patterns”?

swvgeqrz  于 9个月前  发布在  Linux
关注(0)|答案(2)|浏览(111)

我尝试动态记录删除的防火墙事件,从而可以动态指定哪些事件 * 不 * 记录。
我用途:

logread -f | grep -v -f file-with-patterns >> logfile

字符串
在后台运行的脚本中。
这很好用,它记录了所有的事情,除了那些我不想通过在文件“file-with-patterns”中指定模式来记录的事件。
然而,当我更新文件“file-with-patterns”时,grep似乎没有重新读取它。
在对文件“file-with-patterns”进行更改后,我需要杀死并重新启动启动所有这些脚本,这有点麻烦。
这可以在不重启脚本的情况下工作吗?例如,crontab在crontab文件更改时自动重新读取它。grep(或等效实用程序)中是否有类似的功能?
尝试更改具有模式的文件,grep没有更改其筛选。

64jmpszr

64jmpszr1#

简单的方法是在每一行加载配置,我猜性能会受到一点影响。沿着这些行:

第一个月
为了便于(重新)使用,可以从第一个例子中制作一个小型的概念运算符程序:
sudo nano /usr/bin/¬
请记住使其可执行:sudo chmod +x /usr/bin/¬

#! /bin/bash

while read LINE; do echo "$LINE"; done | $*

字符串
然后你可以运行任何命令来代替grep,就像这样:
logread -f |¬ grep -v -f file-with-patterns

更好的技巧是监视文件的更改并重新加载(如果存在)。一种方法是使用名为inotifywait的工具。沿着这些行:

while inotifywait -e modify file-with-patterns; do logread -f | grep -v -f file-with-patterns; done
尝试一下,如果卡住了,请在评论中联系:)

7rtdyuoh

7rtdyuoh2#

您可以使用任何支持delete array的awk(这些都是AFAIK)来替换grep -v -f file-with-patterns,未经测试:

awk -v exceptionsFile='file-with-patterns' '
    function readExceptions(    exception) {
        delete exceptions
        while ( (getline exception < exceptionsFile) > 0 ) {
            exceptions[exception]
        }
        close(exceptionsFile)
    }
    {
        readExceptions()
        for ( exception in exceptions ) {
            if ( $0 ~ exception ) {
                next
            }
        }
        print
    }
'

字符串
它将在每次接收到一行输入时重新读取异常文件,然后通过将其与每个异常作为regexp进行比较来处理该行输入。
当然,你可以引入一个计数器,这样它只会在每N行输入中调用readExceptions(),或者做一些其他的事情来减少它的调用频率,但是只要你的异常文件不是很长,这个函数就会在一瞬间运行,所以对每一行输入都调用它可能是好的。
顺便说一下,可能有一种更有效的方法来完成上述工作(例如,哈希查找而不是循环比较regexp),这取决于您的异常文件的内容,logread工具的输出以及您真正想要匹配的内容-如果您需要帮助,请发布一个带有示例输入/输出的新问题。

相关问题