我写了一个脚本来打印日志文件的特定日期!脚本工作正常,但我用while read 行编写了循环部分, 日志文件包含超过 150000 个项目!脚本想要逐行阅读它需要几个小时!所以,应该以某种方式更改时间!我在 {1..N} 中了解我,但我想要更好的东西,适用于任何日志文件。
你有什么建议?
我写了一个脚本来打印日志文件的特定日期!脚本工作正常,但我用while read 行编写了循环部分, 日志文件包含超过 150000 个项目!脚本想要逐行阅读它需要几个小时!所以,应该以某种方式更改时间!我在 {1..N} 中了解我,但我想要更好的东西,适用于任何日志文件。
你有什么建议?
你必须向我们展示你在做什么。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}
.
使用的目的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}
.
或者,如果您要压缩日志文件,
gunzip -c ${zippedLogFiles_gz) | grep "${date1}|${date2}|${date3}" | grep -i error
通常是一个很好的起点(并且仅将文件解压缩到位(仅将未压缩的输出发送到管道中))。
PS,因为您似乎是新用户,如果您得到的答案对您有帮助,请记住将其标记为已接受,和/或给它一个 +(或 -)作为有用的答案。