尾随文件并使用尴尬执行一组命令



我想在日志文件上运行 tail,并在该日志文件中有一个字符串匹配后执行一组命令。在执行结束时,tail命令应退出。

我的尝试如下所示。似乎在文件中发现的任何字符串都导致tail退出。如果有匹配,则将运行一组命令,tail将按预期退出。

为什么tail即使没有匹配,也会退出?

这是我的命令:

tail -f /logs/logfile.log | awk '/string_to_match/ { system("cp /s1/* /d1") }
                                                   {system("cp /s2/* /d2") } 
                                                   { system("cp /s3/* /d3") }      
                                                   { system("pkill tail") } '

谢谢您的帮助。

@mre:try :(我们不必提及我认为的这么多系统调用,尽管我根本没有测试过)。

tail -f /logs/logfile.log | 
awk '/string_to_match/ {
          system("cp /s1/* /d1; cp /s2/* /d2; cp /s3/* /d3; pkill tail") }'

请尝试一次,让我们知道它的发展。

您不必在当前上下文中使用awk

grep -qs 'string_to_match' logs/logfile.txt && { 
   cp /s1/* /d1; cp /s2/* /d2; cp /s3/* /d3; pkill tail; 
}

在您的情况下

tail -f logs/logfile.txt | grep -qs 'string_to_match' -  && { 
   cp /s1/* /d1; cp /s2/* /d2; cp /s3/* /d3; 
}

pkill tail;不需要grep -q在第一次比赛之后退出

尝试

在一个选项卡中

for i in {1..15}; do echo $i >> a; sleep 1; done 

在另一个选项卡中

tail -f a | grep -sq '3' && { echo found; echo done; }

来自人类

-q

--quiet

--silent

安静;不要将任何内容写入标准输出。如果发现任何匹配,则立即以零状态退出,即使检测到错误。 另请参阅-s或-no -messages选项。(-Q由POSIX指定。)

-s

--no-messages

抑制有关不存在或不可读取文件的错误消息。便携性注意:与GNU GREP不同,第7版Unix Grep没有 符合POSIX,因为它缺乏-Q及其-s选项的表现 GNU GREP的-Q选项。1USG风格的GREP也缺少-Q,但其-S选项 表现得像Gnu Grep的表现。便携式外壳脚本应避免两种-Q 和-s,应将标准和错误输出重定向到/dev/null 反而。(-s由posix指定。)

例如

假设这是log

$ cat logfile 
1
2
3
4
somestring
a
a
s
a

true

$ grep -qs 'somestring' logfile && { echo 'This';  echo 'test'; echo 'done, string found'; } || echo 'not found'
This
test
done, string found

forse

$ grep -qs 'test' logfile && { echo 'This';  echo 'test'; echo 'done, string found'; } || echo 'not found'
not found

您尴尬的写作方式,第二,第三,第四个动作块(最后一个是杀死命令)将对输入的每一行执行,无论是否有匹配。

假设所有命令都应基于一个字符串到匹配,听起来您想要:

tail -f /logs/logfile.log | awk '/string_to_match/ {system("cp /s1/* /d1")
                                                    system("cp /s2/* /d2") 
                                                    system("cp /s3/* /d3")     
                                                    system("pkill tail") }'

最新更新