获取grep输出的空文件

时间:2012-02-10 04:57:41

标签: linux bash grep scp

我在脚本中运行此命令

while [ 1 ]
do

    if [ -e $LOG ]
    then

            grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
            break
    fi

done

$ LOG文件是从另一台机器scp的。因此,只要它出现在当前目录中,while循环就会检测到它并执行grep。问题是,$ FOREMAIL文件变为空。但是如果我在脚本之外运行这个grep作为具有相同文件和参数的独立命令,我可以看到它生成一个输出。

我很困惑为什么这个命令在脚本中没有生成o / p?

5 个答案:

答案 0 :(得分:5)

一旦scp 创建文件,-e就会触发,而它仍然没有数据,而grep正在空文件上运行。您需要等到文件传输完毕。

您可以通过转移到临时文件名来完成此操作,而不是从正在推送文件的计算机上通过ssh运行mv。

编辑:机器复制到日志文件的代码...

scp $log 192.168.0.1:/logfiles/${log}.tmp
ssh 192.168.0.1 mv /logfiles/${log}.tmp /logfiles/${log}

答案 1 :(得分:2)

在你可以grep之前,你需要等待两件事:1)下载开始(文件出现)和2)下载完成(没有人再打开文件)。我有一个脚本调用waitfor.sh,它执行此操作:

#!/bin/bash

# waitfor.sh - wait for a file fully downloaded (via Firefox, scp, ...)
# Syntax:
#   waitfor.sh filename

FILENAME=$1 # Name of file to wait for
INTERVAL=10 # Wait interval of N seconds

# Wait for download started
while [ ! -f $FILENAME ] 
do
    sleep $INTERVAL
done

# Wait for download finished
while lsof $FILENAME
do
    sleep $INTERVAL
done

使用它:

waitfor.sh $LOG
grep ...

答案 2 :(得分:1)

可能是while [1]非常快,所以当文件开始复制时,它在复制完成之前首先显示为空文件?根据文件的大小,在then循环内尝试睡眠延迟。当外部进程完成文件完成复制时,确定可能是一个单独的问题 - 例如谷歌搜索“如何告诉scp复制文件的时间”这样的内容会出现一堆链接,如:https://superuser.com/questions/45224/is-there-a-way-to-tell-if-a-file-is-done-copying

答案 3 :(得分:0)

最好使用:

if [ -f $LOG ]

而不是:

if [ -e $LOG ]
  • -f检查常规类型
  • -e检查任何文件

答案 4 :(得分:0)

这是我最终做的事情:

scp $ LOGFILE

然后

scp $ SCPDONE#empty file

并修改了if子句:

while [ 1 ]
do

    if [ -e $SCPDONE ]
    then

        grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
        break
    fi

done