我正在try 对丢弃的防火墙事件进行动态记录,从而可以动态指定要记录哪些事件not.

我使用:

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

在后台运行的脚本中.

这工作得很好,它通过在文件"FILE-WITH-Patterns"中指定模式来记录除了我不想记录的那些事件之外的所有事件.

然而,当我更新文件"FILE-WITH-Patterns"时,grep似乎没有重新读取它.

在更改文件"FILE-WITH-Patterns"之后,我需要终止并重新启动开始所有这些的脚本,这有点麻烦.

可以在不重新启动脚本的情况下使其工作吗?例如,当crontag文件发生更改时,它会自动重新读取该文件.Grep(或类似的实用程序)中是否有类似的功能?

try 更改带有模式的文件时,grep没有更改其过滤.

推荐答案

您可以使用任何支持delete array的awk(这是目前所有的AFAIK)将grep -v -f file-with-patterns替换为这样的未经测试的awk:

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()次,或者做一些其他的事情来减少它的调用频率,但只要您的异常文件不是很长,该函数就会在 blink 之间运行,所以对每一行输入调用它可能是很好的.

顺便说一下,可能有一种更有效的方法来完成上述工作(例如,哈希查找而不是循环比较regexp),这取决于您的异常文件的内容,logread工具的输出以及您真正想要匹配的内容-如果您需要帮助,请发布一个带有示例输入/输出的新问题.

Linux相关问答推荐

如何调试tokio任务挂起的位置?

如何在 if ... elif struct 中判断 bash 命令的退出状态?

条件句if的正确写法是怎样的?

为什么waitpid(2)可以指定非子进程?

如何在 ERE 中结束这个正则表达式

使用正则表达式捕获特定字符串

c++进程状态中的+是什么意思

如何在 Linux 上使用 -grep 构建过滤间隔的命令

如果 bash 中已经存在文件名,则创建新文件但添加数字

在 Python 上模拟鼠标点击

使用 C/C++ (GCC/G++) 在 Linux 中的套接字编程中发送和接收文件

如何搜索文件并将它们压缩到一个 zip 文件中

Docker Bash 提示不显示 colored颜色 输出

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

*nix 系统上是否有与 COM 等效的功能?如果不是,那么 *nix 的可重用性方法是什么?

如何获取 GNU Makefile 中使用的 shell 命令的退出状态?

Linux控制台中的模糊文件搜索

如何将 ISO8859-15 转换为 UTF8?

如何计算一个单词在目录的所有文件中出现的次数?

在tmux中绑定Ctrl+Tab和Ctrl+Shift+Tab