【shell】awk

希望各位不要白piao,點個贊或者刷個評論再走,還有【禁止轉載】,抄襲轉載必究,謝謝合作。

本篇文章主要講awk,如果已經會了的童鞋,省下時間去了解其他的技術吧~~

awk的簡單用法以及兩個例子
awk的高級用法

【經驗分享】工作的程序員經常會用shell或者python3去寫一些簡單的腳本,或者實現某些簡單的數據處理。這是工作中的常態,當然我說的這類程序員是寫工程類代碼的童鞋,要是算法之類的em……我也沒有什麼經驗,所以這裏也不過多的評價。但是爲什麼要用shell?大家一定有這個疑惑,python3不香麼?當然香呀,但是如果一個新的環境原生支持肯定更香呀,然而在shell的數據處理中用的最多的就是sed和awk。如果sed有什麼不懂得,看我sed的那篇博文,那篇我寫的簡直是不能再細了,博文地址:如何用好sed命令?

awk的簡單用法以及兩個例子

衆所周知,sed以行爲單位處理文件,awk比sed強的地方在於不僅能以行爲單位還能以列爲單位處理文件。awk缺省的行分隔符是換行,缺省的列分隔符是連續的空格和Tab,但是行分隔符和列分隔符都可以自定義。(比如awk -F ','就是按逗號對某個文件進行拆分)比如/etc/passwd文件的每一行有若干個字段,字段之間以:分隔,就可以重新定義awk的列分隔符爲:並以列爲單位處理這個文件。

awk實際上是一門很複雜的腳本語言,還有像C語言一樣的分支和循環結構,但是基本用法和sed類似,awk命令行的基本形式爲:

awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...

和sed一樣,awk處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,編輯命令可以直接當命令行參數傳入,也可以用-f參數指定一個腳本文件,編輯命令的格式爲:
/pattern/{actions}
condition{actions}
和sed類似,pattern是正則表達式,actions是一系列操作。awk程序一行一行讀出待處理文件,如果某一行與pattern匹配,或者滿足condition條件,則執行相應的actions,如果一條awk命令只有actions部分,則actions作用於待處理文件的每一行。
【Case1】:文件testfile的內容表示某商店的庫存量:
ProductA 30
ProductB 76
ProductC 55
現在要打印每一行的第二列:

awk '{print \$2;}' testfile

運行結果爲:
30
76
55
自動變量$1、$2分別表示第一列、第二列等,類似於Shell腳本的位置參數,而$0表示整個當前行。如果位置參數不懂?看我另一篇講位置參數的博文,什麼$@,$1之類的寫的十分的詳細,博文地址:什麼是位置參數?什麼是$@?

【Case2】:再比如,如果某種產品的庫存量低於75則在行末標註需要訂貨:

 awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile 

運行結果爲:
ProductA 30 REORDER
ProductB 76
ProductC 55 REORDER
可能有小白不理解哈,這東西就相當於一個if……else,學過c的同學應該很明白,%s就是字符串的佔位符,這裏需要提一下如果沒有用到-F那麼awk默認是按照空格進行拆分的。剩下的我覺得就沒有什麼需要說明的,結合運行結果就能一目瞭然,如果還是有問題評論留言吧。

awk的高級用法

從上面的兩個case可見awk也有和C語言非常相似的printf函數。awk命令的condition部分還可以是兩個特殊的condition-BEGIN和END,對於每個待處理文件,BEGIN後面的actions在處理整個文件之前執行一次,END後面的actions在整個文件處理完之後執行一次。
awk命令可以像C語言一樣使用變量(但不需要定義變量),比如你不需要在使用前搞個 int x= 0;就是不需要聲明後再使用,看下面這個例子:
【Case1】:統計一個文件中的空行數

awk '/^ *$/ {x=x+1;} END {print x;}' testfile

可能小白在正則這個地方看不太懂,這個其實很好查,所有語言的正則其實都差不多,這裏面的正則就是匹配行的開頭和結尾,翻譯一下就是匹配每一行。以後我會把我自己整理的各種正則分享出來。如果還是不太懂得baidu一下,baidu不到就google一下。

以上的東西都算比較小case的,就像Shell的環境變量一樣,有些awk變量是預定義的有特殊含義的:

內建變量 變量含義
FILENAME 當前輸入文件的文件名,該變量是隻讀的
NR 當前行的行號,該變量是隻讀的,R代表record
NF 當前行所擁有的列數,該變量是隻讀的,F代表field
OFS 輸出格式的列分隔符,缺省是空格
FS 輸入文件的列分融符,缺省是連續的空格和Tab
ORS 輸出格式的行分隔符,缺省是換行符
RS 輸入文件的行分隔符,缺省是換行符

【Case2】:例如打印系統中的用戶帳號列表

awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd

用的比較多的就是NF和NR,這東西就是shell內置的不用聲明,直接使用就好了。使用方法跟上面的例子一樣,如果還需要我補充一些工作中的一些case,評論留言,因爲每個人的水平是不一樣的,我也不知道應該寫成什麼樣子,但我還是希望更多崇尚技術的小白能夠正確的走這條路,畢竟我在工作之前我就會cd ls這種命令而已 哈哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章