欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
為什么你應該學(xué)點(diǎn)Awk(附指南及示范) By yuanyi

為什么你應該學(xué)點(diǎn)Awk(附指南及示范)

在我還讀研究生時(shí),我被一個(gè)我曾共事過(guò)的教授向我展示的高超文本文件操作能力震撼了,于是我決定花點(diǎn)時(shí)間學(xué)學(xué)他用來(lái)操作文本文件的神器Awk。

即便是在今天,我所認識的90%的程序員幾乎從沒(méi)用過(guò)awk,其實(shí)只要你花上幾分鐘了解哪怕只是awk10%的語(yǔ)法,它都能夢(mèng)幻般的提高你操作文本文件的能力。下面就讓我來(lái)教你一些最有用的操作——注意,不是“最基礎的”,只要你愿意花上5分鐘時(shí)間練習下這些技巧,我相信你就將會(huì )領(lǐng)悟到我認為這門(mén)語(yǔ)言最為有趣的東西。

Awk實(shí)際上是一門(mén)非常有趣的小型編程語(yǔ)言,它設計的主要目的就是為了處理字符串。還記得有次我們的一個(gè)教授為我們布置了一道計算機網(wǎng)絡(luò )的課程作業(yè),讓我們根據RPC協(xié)議編寫(xiě)一個(gè)可以生成客戶(hù)端和服務(wù)端stub的程序,但是這個(gè)教授犯了一個(gè)錯誤,他告訴我們可以使用任何我們想要的語(yǔ)言,于是我決定用Awk來(lái)寫(xiě)一個(gè),我原本的目的只是為了更好的掌握Awk,但是讓我驚奇的是,我發(fā)現最終我的實(shí)現要比其它我用過(guò)的語(yǔ)言(Python,C++,Java)都更簡(jiǎn)短。

如果要了解Awk,你可以看看這本書(shū),當然我已經(jīng)看過(guò)了,但是你可能并不想像我那樣用Awk來(lái)實(shí)現某個(gè)協(xié)議的一個(gè)解析器,或許你只是想從你的日志文件中找出那些IP地址加起來(lái)剛好是666的家伙,那就跟我來(lái)吧,繼續往下看!

讓我們先來(lái)看個(gè)例子,假設我們有一個(gè)小文件(logs.txt)看起來(lái)像是下面這樣,很簡(jiǎn)單,它只有2行帶有IP地址的log信息:

07.46.199.184 [28/Sep/2010:04:08:20] "GET /robots.txt HTTP/1.1" 200 0 "msnbot"
123.125.71.19 [28/Sep/2010:04:20:11] "GET / HTTP/1.1" 304 - "Baiduspider"

這是兩條由Apache生成的日志信息,很簡(jiǎn)單,它們顯示了Bing和Baidu的爬蟲(chóng)昨天到訪(fǎng)過(guò)我的網(wǎng)站。

Awk同其它命令行程序(比如grep)一樣,都是從stdin讀取輸入并寫(xiě)到stdout,所以你可以很容易的通過(guò)管道使用它,Awk的使用也很簡(jiǎn)單,你唯一需要關(guān)心的它令后面的那個(gè)字符串參數:

awk '{print $0}'

大部分awk程度都是以{開(kāi)頭,并以}結束的,{}中包含的命令會(huì )在輸入中的每一行上執行,大部分awk程序都會(huì )打印些什么東西,上面的命令會(huì )原封不動(dòng)的將它讀到的輸入再打印出來(lái),并添加一個(gè)換行,$0代表一整行。所以這個(gè)程序很典型——它除了將輸入拷貝到輸出,其它什么都沒(méi)做。

Awk還會(huì )根據輸入行中的空白字符(空格,tab)自動(dòng)將行切分為字段,并自動(dòng)處理連著(zhù)的分隔字符,你可以通過(guò)$1,$2,$3等來(lái)引用分割后的字段。

echo 'this is a test' | awk '{print $3}' // prints 'a'
awk '{print $1}' logs.txt

輸出:

07.46.199.184
123.125.71.19

很簡(jiǎn)單,并且很有用,不是嗎?但是有時(shí)我需要從字符串的結尾開(kāi)始打印,這時(shí)我可以使用一個(gè)名為NF的特殊變量,它包含了當前行的字段數,因此我可以使用$NF來(lái)打印最后一個(gè)字段,我也可以通過(guò)這個(gè)值來(lái)反向查找某個(gè)字段,同時(shí)我還可以在一行打印多個(gè)值:

echo 'this is a test' | awk '{print $NF}' // prints "test"
awk '{print $1, $(NF-2) }' logs.txt

輸出:

07.46.199.184 200
123.125.71.19 304

更進(jìn)一步——現在你可以看到,我們可以將日志文件分割,并只打印我們關(guān)心的部分。另一個(gè)很有用的變量就是NR,這個(gè)變量表示當前正在處理的輸入的行號。在我演示NR的同時(shí),我還想展示一下如何使用print來(lái)格式化輸出,你可以使用逗號來(lái)分隔print的多個(gè)參數,它們會(huì )被轉化為空格,但是下面的例子我沒(méi)有使用逗號,所以結果中也沒(méi)有插入空格:

awk '{print NR ") " $1 " -> " $(NF-2)}' logs.txt

輸出:

1) 07.46.199.184 -> 200
2) 123.125.71.19 -> 304

很強大,并且一點(diǎn)也不難,對吧,如果你喜歡,你還可以使用printf函數,或許你對它更熟一些?,F在,問(wèn)題來(lái)了,不是所有字段都是以空格作為分隔符的,比如下面這個(gè):

$ awk '{print $2}' logs.txt

輸出:

[28/Sep/2010:04:08:20]
[28/Sep/2010:04:20:11]

日期字段使用了/和:作為分隔符,當然我可以通過(guò)一條awk命令來(lái)完成這個(gè)操作,但是我想向你演示一種更簡(jiǎn)單也是你更為熟悉的方式:Unix管道,下面我要做的就是通過(guò)管道使用另外一條awk命令來(lái)根據冒號對日期進(jìn)行分割,要做到這一點(diǎn),我的第二個(gè)awk命令需要使用2個(gè){},不過(guò)我暫時(shí)不想對這個(gè)多做解釋?zhuān)阒灰纯次沂侨绾巫龅木托辛耍?/p>

$ awk '{print $2}' logs.txt | awk 'BEGIN{FS=":"}{print $1}'

輸出:

[28/Sep/2010
[28/Sep/2010

我為FS(也就是字段分隔符)指定了一個(gè)不同的值,也就是":",然后打印出了第一個(gè)字段,現在沒(méi)有時(shí)間了,只有日期!如果你不想看到輸出中的那個(gè)[,最簡(jiǎn)單的方法就是使用sed,或許你早就知道了:

$ awk '{print $2}' logs.txt | awk 'BEGIN{FS=":"}{print $1}' | sed 's/\[//'

輸出:

28/Sep/2010
28/Sep/2010

使用相同的技巧,我還可以進(jìn)一步根據'/‘字符來(lái)切分日期,但是我認為你已經(jīng)掌握這個(gè)技巧了,所以我就不羅嗦了,下面,讓我們來(lái)試著(zhù)加入一點(diǎn)點(diǎn)邏輯判斷,如果我只想得到狀態(tài)為200的行,我可以使用grep,但是如果我想得到IP地址中包含200的行,或者是日期在2000年以后的行,那我就需要先使用awk,然后在通過(guò)grep來(lái)查找了,不過(guò)的問(wèn)題是輸出結果沒(méi)了上下文,還好,Awk支持if條件判斷,所以我們可以像下面這樣:

$ awk '{if ($(NF-2)=="200") {print $0}}' logs.txt

輸出:

07.46.199.184 [28/Sep/2010:04:08:20] "GET /robots.txt HTTP/1.1" 200 0 "msnbot"

現在,只有符合條件的行才會(huì )被輸出,這個(gè)if語(yǔ)句實(shí)在是太熟悉不過(guò)了,應該不需要我做過(guò)多的解釋?zhuān)旅孀屛彝ㄟ^(guò)一個(gè)蠢例子向你演示下awk如何實(shí)現跨行保存狀態(tài),假設我想得到這個(gè)文件中所有HTTP相應的狀態(tài)字段的和,雖然我實(shí)在想不出有有什么理由這樣做,但是為了演示字段求和,就讓我們先忘掉這一點(diǎn)吧,要做到這一點(diǎn),我只需要創(chuàng )建一個(gè)變量就okay了:

$ awk '{a+=$(NF-2); print "Total so far:", a}' logs.txt

輸出:

Total so far: 200
Total so far: 504

很顯然,這是有問(wèn)題的,大部分情況下,我并不需要中間值,只需要最后的結果就可以了,當然我可以使用tail -n1,但是還有一種更好的方式,我可以使用END關(guān)鍵字告訴awk只在最后一行調用print:

$ awk '{a+=$(NF-2)}END{print "Total:", a}' logs.txt

輸出:

Total: 504

如果你想要了解更多關(guān)于awk的知識,有幾本好書(shū)以及大量的線(xiàn)上資源可供你參考,只需要花上一些閑暇時(shí)間,你就可以很容易的學(xué)到關(guān)于awk的一切,但是要熟練使用它,還是有些挑戰的,因為它的編碼方式實(shí)在有點(diǎn)特別——你實(shí)際上是在寫(xiě)一個(gè)for循環(huán)的內部實(shí)現,仔細想想,這其實(shí)有點(diǎn)MapReduce的感覺(jué),只是一開(kāi)始會(huì )讓人有些迷惑。

我希望這篇文章能對你有用,如果你覺(jué)得它有用,不妨給我留言。

更新: 這篇文章的許多評論都很值得一讀,當然我很希望它們都能在一個(gè)地方,但現在我只能把它們分別列出來(lái):

Programming Reddit
Hacker News

最后,如果你是那種對awk感興趣的人,毫無(wú)疑問(wèn),你就是那種我希望可以在Google共事的人,如果你感興趣,可以給我簡(jiǎn)歷(ggrothau@gmail.com),我可以確保它一定會(huì )出現在合適的招聘者面前,而不是遺落在我們每天收到的那一大堆簡(jiǎn)歷中。

--------------
本文來(lái)自"Why you should learn just a little Awk - A Tutorial by Example",作者:Greg,翻譯:@yuanyiz

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
linux Shell學(xué)習筆記第一天
Linux必學(xué)技能:文本操作三劍客(awk/sed/grep)應用實(shí)例
常用文本處理命令
shell中字符串截取命令:cut,printf,awk,sed
Linux awk
Linux文本處理三劍客之a(chǎn)wk學(xué)習筆記03:讀取文件
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久