2014-03-13 82 views
1

我有一個while循環,它讀取一個ftp日誌文件並將其放入一個數組中,這樣我就可以搜索數組並匹配/搜索流。不幸的是,while循環是永久性的通過文件,它是一個非常大的文件,但必須有另一個更快的方式來做到這一點。Bash腳本/ while循環非常慢讀取文件

# read file into array for original search results 
while read FTP_SEARCH 
do 
ogl_date[count]=`echo $FTP_SEARCH | awk '{print $1, $2}'` 
ogl_time[count]=`echo $FTP_SEARCH | awk '{print $3}'` 
ogl_server[count]=`echo $FTP_SEARCH | awk '{print $4}'` 
ogl_id[count]=`echo $FTP_SEARCH | awk '{print $5}'` 
ogl_type[count]=`echo $FTP_SEARCH | awk -F '[' '{print $1}' | awk '{print $5}'` 
ogl_pid[count]=`echo $FTP_SEARCH | awk -F'[' '{print $2}' | awk -F']' '{print $1}'` 
ogl_commands[count]=`echo $FTP_SEARCH | awk '{ 
    for(i = 6; i <= NF; i++) 
     print $i; 
    }'` 

let "count += 1" 

done < /tmp/ftp_search.14-12-02 


Dec 1 23:59:03 sslmftp1 ftpd[4152]: USER xxxxxx 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: PASS password 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: FTP LOGIN FROM 172.19.x.xx [172.19.x.xx], xxxxxx 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: PWD 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: CWD /test/data/872507/ 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: TYPE Image` 
Dec 1 23:59:03 sslmftp1 ftpd[4152]: PASV 
Dec 1 23:59:04 sslmftp1 ftpd[4152]: NLST 
Dec 1 23:59:04 sslmftp1 ftpd[4152]: FTP session closed 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: USER xxxxxx 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: PASS password 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: FTP LOGIN FROM 172.19.1.24 [172.19.x.xx], xxxxxx 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: PWD 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: CWD /test/data/944837/ 
Dec 1 23:59:05 sslmftp1 ftpd[4683]: TYPE Image 
+0

請從ftp_search.14-12-02發佈示例行。多次調用'awk'來分析每行是什麼讓你放慢速度。在'bash'中有很多更好的解析方法,但是我需要看看哪一行看起來像是建議最好的方法。 – chepner

+0

或者,由於沒有其他外部程序的調用,它可以在1個awk程序中完成。示例數據是必需的。祝你好運。 – shellter

+0

'Dec 1 23:59:03 sslmftp1 ftpd [4152]:USER xxxxxx Dec 1 23:59:03 sslmftp1 ftpd [4152]:PASS密碼 Dec 1 23:59:03 sslmftp1 ftpd [4152]:FTP LOGIN FROM 172.19.x.xx [172.19.x.xx],xxxxxx Dec 1 23:59:03 sslmftp1 ftpd [4152]:PWD Dec 1 23:59:03 sslmftp1 ftpd [4152]:CWD/test/data/872507/ Dec 1 23:59:03 sslmftp1 ftpd [4152]:TYPE Image' – cycloxr

回答

5
  • 你並不需要保持一個迭代器添加到陣列。你可以簡單地做array+=(item)而不是array+=item)。
  • 獲取輸入中的列與使用read與多個目標變量一樣簡單。作爲獎勵,最後一個變量獲得第N個詞和所有後續詞。請參閱help [r]ead

這節省了大量的叉子,但我沒有測試它有多快。

ogl_date=() 
[...] 
ogl_commands=() 

while read -r date1 date2 time server id type pid commands 
do 
    ogl_date+=("$date1 $date2") 
    [...] 
    ogl_commands+=("$commands") 
done < /tmp/ftp_search.14-12-02 
+0

,雖然效果很好,但它仍然很慢,花了幾分鐘時間才能完成所有任何其他想法,我可以嘗試。我非常感謝你的幫助! – cycloxr

+0

你想做什麼?在詳細處理之前,您是否無法排除大部分文件? – l0b0

+0

@ user2208986是否按照原樣試用,還是在基準測試之前添加了所有自定義邏輯? shell腳本中的主要性能殺手是分叉,這在使用''''''''','$(..)'調用外部命令和管道時會發生。這個例子沒有這些,但你有很多。 –