2014-02-16 17 views
1

我有一個CGI腳本(用Bash編寫),它將記錄關於人們如何訪問我的網站的一些信息。我通過$ HTTP_USER_AGENT獲得了這種信息,但我想用操作系統,瀏覽器類型,瀏覽器版本等不同的列將其記錄在我的數據庫中。以下是字符串在我的瀏覽器中的樣子:處理HTTP_USER_AGENT字符串信息

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 

在這種情況下,我想使用Chrome版本32.0.1700.107來記錄訪問是從Mac OS X 10_9_1進行的。

我想有人已經完成了這個字符串處理工作,但我無法通過StackOverflow中的正確關鍵字進行搜索。有誰知道該怎麼做?我可以將它從其他語言移植到Bash,我想這不會成爲問題!

謝謝大家提前!

+3

不要打擾解析它到這樣一個粒度級別。無論如何,許多瀏覽器(而不是使用者)都會使用它。 – devnull

+1

使用Python我認爲這樣的任務更好... – MLSC

回答

1

devnull已經評論過,自動解析這些字符串會很棘手。有很多很多瀏覽器,而且幾乎沒有任何瀏覽器將用戶代理字符串構造成相同的。

如果你有興趣用Bash解析文本,但我會建議學習使用正則表達式和linux命令行工具sed

使用的sed例如,你可以拉出來,然後像版本號的Mac OS X的任何實例:

echo "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36" | sed 's/.*\(Mac\ OS\ X\ [0-9]\+_[0-9]\+_[0-9]\+\).*/\1/'

sed命令上面的字符串匹配Mac OS X #_#_#。數字用[0-9]表示,後面的加號表示允許重複。上面的命令返回以下:

Mac OS X 10_9_1

您可以運行類似的東西來解析出Chrome和它的版本號,如:

sed 's/.*\(Chrome\/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/'

有一些正則表達式魔術會在這裏等匹配組(圍繞我們希望保留在括號內的部分,並用\ 1傳遞它)和轉義保留字符,如空格,加號,句號和正斜槓。

0

在這種情況下,raptastics具有最好的答案,但是如果您希望可以很好地使用「Perl」並將$ HTTP_USER_AGENT分隔到「/」分隔符處並使用鍵/值對處理它們。再次,你的問題的答案真的取決於你在做什麼。