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 [文件...]
好像 $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)
归档时间: |
|
查看次数: |
2149 次 |
最近记录: |