grep:在 AIX 中不是公认的标志

Pre*_*rya 3 grep aix shell-script

我正在尝试编写一个 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
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出,

grep:未识别的标志:- 用法:grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [- p[parasep]] -e pattern_list... [-f pattern_file...] [file...]

用法: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 [文件...]

tri*_*eee 7

好像 $LINE包含一个以破折号开头的值。

你可以防止这种情况

grep -q -e "$LINE"
Run Code Online (Sandbox Code Playgroud)

更一般地说,大多数 Unix 命令允许 --标记选项的结束,因此在此“选项结束”选项之后的任何参数都将被视为文字的非选项参数。

echo也会有问题;便携式解决方案是切换到printf,它适用于以破折号开头的参数,只要它不是第一个参数,即格式字符串。

您还应该避免使用大写的变量名;这些保留供系统使用。

最后,脚本几乎不需要显式检查$?——这已经由if,while和其他控制结构完成。

if grep -q -e "$line" log.log; then
    printf '%s\n' "$line"
fi
Run Code Online (Sandbox Code Playgroud)

作为一种优化,将重定向放在循环之外会使事情变得更快。

while read -r line; do
    grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt
Run Code Online (Sandbox Code Playgroud)