我正在尝试编写一个 shell,它将从表中获取一组数据并将其写入名称为 的文本文件result.txt
。现在我将从该文件中选取每一行并在日志文件中搜索它并检查它是否存在。如果在日志文件中找不到它,我想将其写入一个单独的文件中,比如notfound.txt
.我正在 AIX 服务器上工作,并收到以下命令错误grep
。有人可以帮我找出问题所在吗?
这是我的脚本,
while read -r LINE; do
grep -q "$LINE" log.log
if [ $? -eq 0 ]
then
echo "$LINE" >> /home/notfound.txt
fi
done < result.txt
这给了我以下输出,
grep:不是可识别的标志:- 用法:grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [- p[parasep]] -e 模式列表... [-f 模式文件...] [文件...]
用法:grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e模式列表...] -f 模式文件... [文件...]
用法:grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] pattern_list [file...]
答案1
看起来$LINE
包含一个以破折号开头的值。
您可以通过以下方式防止这种情况发生
grep -q -e "$LINE"
更一般地,大多数 Unix 命令允许--
标记选项结束,因此此“选项结束”选项之后的任何参数都将被视为文字、非选项参数。
echo
也会有问题;可移植的解决方案是切换到printf
,它可以很好地处理以破折号开头的参数,只要它不是第一个参数(格式字符串)。
您还应该避免使用大写变量名;这些是保留供系统使用的。
最后,脚本几乎不需要显式检查$?
- 这已经由if
和while
其他控制结构完成。
if grep -q -e "$line" log.log; then
printf '%s\n' "$line"
fi
作为一种优化,将重定向放置在循环之外将使事情变得更快。
while read -r line; do
grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt