读取LINE时如何更换

时间:2011-09-28 17:43:19

标签: shell while-loop logfile

我写了一个脚本来打印日志文件的特定日期!该脚本工作正常,但我用读取行编写了循环部分,日志文件包含超过150000个项目!脚本想要逐行读取它需要几个小时!所以,应该以某种方式改变while!我在{1..N}知道我,但我想要更好的东西,适用于任何日志文件。

你有什么建议吗?

1 个答案:

答案 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。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。