我写了一个脚本来打印日志文件的特定日期!该脚本工作正常,但我用读取行编写了循环部分,日志文件包含超过150000个项目!脚本想要逐行读取它需要几个小时!所以,应该以某种方式改变while!我在{1..N}知道我,但我想要更好的东西,适用于任何日志文件。
你有什么建议吗?答案 0 :(得分:1)
你必须告诉我们你在做什么。请编辑您的帖子,以包含说明问题的while
循环代码的最小子集。另外,请显示任何错误或警告消息的确切文本。
根据你的评论'......我应按每行输入的回车'。你肯定做错了什么。阅读每一行应该是自动的。这是使用bash处理文件的基本概要。
你会考虑使用awk吗?我可以使用该标准工具发布更好的解决方案。
inputFiles="${@}"
cat "${inputFiles}"\
| while read line ; do
case ${line} in
2[0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]* )
# matched date
print ${line}
;;
* )
# you'll need to add other reg-expes here to extract data you want
;;
esac
done
您可能必须删除${inputFiles}
上的dbl-quotes。
使用cat ${inputfiles | while read line ...
的目的是允许处理您在cmdline上列出的任何文件。
您是否尝试使用grep
查看日志文件?
date1='2011-09-11' ; date2='2011-09-12'; date3='2011-09-13'
grep "${date1}|${date2}|${date3}" *.logFiles | grep -i error
你也可以在上面的while循环中使用date1 ...作为案例目标。
case ${line} in
${date1}*|${date2}*|${date3}* )
echo $line
;;
esac
如果日期不是该行中的第一个元素,您可能会删除上面的“*
”,您可能需要在每个{*
前面添加“${dateN}
” 1}}。
或者,如果您要保留日志文件,
gunzip -c ${zippedLogFiles_gz) | grep "${date1}|${date2}|${date3}" | grep -i error
通常是一个很好的起点(只需将文件解压缩到位(只需将未压缩的输出发送到管道中))。
P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。