【发布时间】:2018-01-25 01:54:11
【问题描述】:
我正在编写一个 Bash 脚本,我需要在其中查看命令的输出并根据该输出执行某些操作。为清楚起见,此命令将输出几百万行文本,并且可能需要大约一个小时左右的时间。
目前,我正在执行该命令并将其传送到一个 while 循环中,该循环一次读取一行,然后查找某些条件。如果该标准存在,则更新 .dat 文件并重新打印屏幕。下面是脚本的 sn-p。
eval "$command"| while read line ; do
if grep -Fq "Specific :: Criterion"; then
#pull the sixth word from the line which will have the data I need
temp=$(echo "$line" | awk '{ printf $6 }')
#sanity check the data
echo "\$line = $line"
echo "\$temp = $temp"
#then push $temp through a case statement that does what I need it to do.
fi
done
所以问题来了,对数据的完整性检查显示出奇怪的结果。它正在打印不包含 grep 条件的行。
为了确保我的 grep 语句正常工作,我对包含命令输出的文本记录的日志文件进行 grep,它只输出包含指定条件的行。
我对 Bash 还很陌生,所以我不确定发生了什么。可能是该命令在处理满足 grep 条件的 $line 之前强制为 while 循环提供一个新的 $line 吗?
任何想法将不胜感激!
【问题讨论】:
-
eval "$command"应该只是$command。此处无需使用eval -
如果您没有将输入传递给
grep,它将从标准输入读取。这意味着它将在循环的第一次迭代中消耗整个输出。 -
我最初只有“$command”,但它不能正常工作,所以我做了一些谷歌搜索并添加了 eval,它开始正常运行。我不确定 eval 的作用,但它解决了问题。
-
没有引号,只有
$command。当您不确定他们在做什么时,不要执行命令。 -
hek2mgl 所说的适用于所有命令,尤其是
eval。
标签: linux bash shell while-loop pipe