我寫了一個腳本來打印日誌文件的特定日子!該腳本正常工作,但我寫了的循環部分,而行和日誌文件包含超過150000項!腳本想要逐行讀取它,並且需要數小時!所以,一段時間應該以某種方式改變!我知道{1..N}中的我,但我想要更好的工作來處理任何日誌文件。如何在讀取時更換LINE
你有什麼建議?
我寫了一個腳本來打印日誌文件的特定日子!該腳本正常工作,但我寫了的循環部分,而行和日誌文件包含超過150000項!腳本想要逐行讀取它,並且需要數小時!所以,一段時間應該以某種方式改變!我知道{1..N}中的我,但我想要更好的工作來處理任何日誌文件。如何在讀取時更換LINE
你有什麼建議?
你必須告訴我們你在做什麼。請編輯您的帖子,以包含說明您的問題的最小子集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引號。
使用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
往往是一個很好的起點(只有解壓到位文件(只發送未壓縮輸出入管))。
P.S.因爲你似乎是一個新用戶,如果你得到一個可以幫助你的答案,請記住將它標記爲已接受,並且/或者給它一個+(或 - )作爲有用的答案。
是perl的一個選項嗎?您可以嘗試使用正則表達式工具解析它。無論如何,它會花很多時間。 – FailedDev
沒有在bash shell不是Perl!我不知道什麼是正則表達式!我是初學者 – matarsak
用bash閱讀150,000行不需要幾小時。身體的內容是您報告緩慢的原因。 –