【发布时间】:2021-09-23 11:35:49
【问题描述】:
我有一个 bash 脚本,它处理 SQL 文件以获取将多个寄存器插入offer 表的行。代码是:
if [ -f "$last" ]; then
retry=0
lines=$(grep "INSERT INTO \`offers\`" "$last" | sed -e $'s/),(/)\\\n, (/g')
while [ -z "$lines" ]; do
retry=$(( 1 + $retry ))
printf "Retry %3d\n" $retry
sleep 1
lines=$(grep "INSERT INTO \`offers\`" "$last" | sed -e $'s/),(/)\\\n, (/g')
done
if [ -n "$output" ]; then
echo "$lines" > "$output"
else
echo "$lines"
fi
fi
路径名是$last var。该文件存在,并且已填充,并且具有我要查找的行。但是,正如您所看到的,我需要重试几次才能获得线路,但最终我得到了它。我想知道,为什么我需要多次尝试?更好的是,如何在第一次尝试时获得它?
一些注意事项:文件很长(300M),我要查找的行大约有 30,000 个字符长度。
【问题讨论】:
-
也许你要找的部分还没有写出来?是否有可能写入文件的任何内容都与您的脚本运行并行? existing 文件并不意味着它已经完全写入。您可能应该弄清楚如何找出正在写入文件的东西何时完成写入,然后才访问该文件。如果您没有简单的方法来做到这一点,您可以使用迂回的方法,例如检查
lsof是否有人仍然打开文件以供写入,或者等待其大小为非零且不再增加几秒钟。 -
或者文件可能一直被重写,导致它在
grep试图读取它的中间被截断?在这种情况下,您可以尝试重命名文件,等待它被完全写入然后读取它(以便下一个写入周期将转到具有原始名称的新文件)。了解应该如何创建此文件会很有帮助。 -
感谢@CherryDT。不,当我尝试 grep 文件时,文件已满。我没有在上面包含这些行,但脚本会等待。并且没有其他进程在处理文件时重写文件。
-
那么发生的事情是不合逻辑的。你100%确定吗?每次
grep时尝试运行tail "$last",以确保100% 确定这一点。 -
你是对的@CherryDT,当我尝试 grep 文件时,文件没有写满。它可能需要另一个不同的问题,因为脚本调用 mysqldump 来创建文件,并且它似乎在开始查找该行之前就完成了。但是没有,调用返回后mysqldump继续往文件中写入数据。
标签: bash macos file grep script