【问题标题】:why this code isn't working in bash?为什么这段代码在 bash 中不起作用?
【发布时间】:2017-08-30 11:54:48
【问题描述】:

我正在使用 tail -f 获取日志文件和日志输出此命令输入到 grep 命令并搜索“ERROR”字符串,并且 grep 的输出用于创建/写入临时文件(tmpLog )。

命令:

tail -f logfile |  grep -n -i "ERROR" > tmpLog

日志文件内容

100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.003
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0033
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.004
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.005
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.006
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.007
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0023
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0043
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.004
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.005
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.006
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.007
100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0043

问题是,我没有在 tmpLog 文件中获取内容,虽然它已创建但内容为空 但是当我尝试这个时

tail -f 日志文件 | grep -n -i "错误" *> tmpLog

我有 tmpLog 中的内容

a.sh:21:    tail -f logfile |  grep -n -i "ERROR" > tmpLog &  #> /dev/null
logfile:1:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.003
logfile:2:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0033
logfile:3:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.004
logfile:4:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.005
logfile:5:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.006
logfile:6:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.007
logfile:7:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0023
logfile:8:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0043
logfile:9:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.004
logfile:10:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.005
logfile:11:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.006
logfile:12:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.007
logfile:13:100.66.230.2 - - [03/Apr/2017:11:40:23 +0900] "ERROR /favicon.ico HTTP/1.1" 200 26238 0.0043

但我得到了这一行 a.sh:21: tail -f logfile | grep -n -i "ERROR" > tmpLog & #> /dev/null 在我不想要的日志顶部

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    您的工作目录中有一个名为a.sh 的文件吗?

    是这个文件的第 21 行:

    tail -f 日志文件 | grep -n -i "ERROR" > tmpLog & #> /dev/null

    你似乎得到这个的原因是因为在你的第二个例子中,你正在有效地运行:

    grep -n -i "ERROR" * > tmpLog
    

    捕获当前目录中包含ERROR的所有行。

    tail -f 实际上是一个无穷无尽的流,因此不适合以您似乎使用的方式重定向到文件中。

    您可能想查看this SU post,了解缓冲如何导致重定向输出出现问题。

    【讨论】:

    • 是的,我有。我接到你了 。谢谢
    猜你喜欢
    • 2010-09-18
    相关资源
    最近更新 更多