awk详细教程:第二部分
?2.3 表達式和運算符
awk?允許使用正則表達式,根據正則表達式是否匹配當前行來選擇執行獨立代碼塊。以下示例腳本只輸出bill中包含字符序列8613902700003的那些行:
?當然,可以使用更復雜的正則表達式:
下面列出正則表達式元字符:
| 字符 | 描述 |
| . | 可代替除一行之外的任何單個字符 |
| * | 可代替零個或多個在它前面出現的字符 |
| [chars] | 可代替chars中的任何一個字符,chars是一串字符序列。你可以用-符號來定義一個字符范圍。如果^是chars中的第一個字符,那么將匹配沒有在chars中指定的字符 |
| ^ | 匹配一行的開頭 |
| $ | 匹配一行的結尾 |
| \ | 把\后面的字符照常輸出,通常用來轉義(不使用特殊含義)一個元字符 |
?
除了使用正則表達式來選擇行,我們也可以使用布爾表達式來選擇行。使用方法是將布爾表達式放在代碼塊之前,僅當對前面的布爾表達式求值為真時,awk才執行代碼塊。以下示例腳本將輸出bill中第四個字段等于8613902700003的所有行中的第三、四字段。如果當前行的第四個字段不等于8613902700003,awk將繼續處理文件而不對當前行執行print語句:
?
?
注意,代碼塊前的布爾表達式必須與代碼塊在同一行上。
awk?提供了完整的比較運算符集合,包括"=="、"<"、">"、"<="、">="和"!="。另外,awk還提供了"~"和"!~"?運算符,它們分別表示“匹配”和“不匹配”。它們的用法是在運算符左邊指定變量,在右邊指定正則表達式。例如:
?
?
awk還允許使用布爾運算符"||"(邏輯或)和"&&"(邏輯與),以便創建更復雜的布爾表達式:
?
awk的另一個優點是它有完整的數學運算符集合。除了標準的加、減、乘、除,awk還允許使用指數運算符"^"、模運算符"%"和其它許多從C語言中借入的易于使用的賦值操作符。
這些運算符包括前后加減(i++、--j)、加/減/乘/除賦值運算符(a+=3、b*=2、c/=2.2、d-=6.2)。不僅如此,還有易于使用的模/指數賦值運算符(a^=2、b%=4)。
?
2.4 字符串化變量
awk變量“字符串化”是指所有awk變量在內部都是按字符串形式存儲的。而且只要變量包含有效數字字符串,就可以對它執行數學操作,awk會自動處理字符串到數字的轉換步驟。請看以下這個示例:
這個例子的功能是計算文件中空白行的數量,^$表示空行。如果做一個小實驗,就可以發現如果某個特定變量不包含有效數字,awk在對數學表達式求值時會將該變量當作數字0處理。
3 第二部分:提高
3.1 處理多行
?
在這一節里,順帶著講一下三個特別的變量:
| Awk特殊變量 | 描述 |
| RS | 表示記錄分隔符 |
| OFS | 表示輸出字段分隔符,在兩個單獨的字段間插入定義的字符串 |
| ORS | 表示輸出記錄分隔符,在兩個單獨的記錄間插入定義的字符串 |
第一部分我們討論的都是一個記錄占用一行的情況,如果要分析占據多行的記錄,除了依靠FS,還需要設置RS(記錄分隔符變量)。RS變量告訴awk當前記錄什么時候結束,新記錄什么時候開始。
為了便于討論,我們依然首先在當前目錄下生成一個通訊錄文件address,其內容如下:
| zhangsan 13712345678 zhs@hotmail.com lisi 13012345678 ls@21cn.com |
要處理這個文件,可以將每三行看作是一個獨立的記錄,一個記錄包含三個字段。如下腳本將原記錄由三行轉換成一行輸出:
?
?此代碼將產生以下輸出:
| zhangsan, 13712345678, zhs@hotmail.com lisi, 13012345678, ls@21cn.com |
在上面例子中,為了在三個字段之間插入一個逗號和空格,使用了", "。這個方法雖然有用,但比較難看。其實我們還有更好的方法,那就是設置變量OFS(輸出字段分隔符)。OFS缺省情況下被設置成" "(單個空格)。使用如下腳本可以達到上面例子同樣的效果:
awk還有一個特殊變量ORS(輸出記錄分隔符)。ORS缺省情況下被設置成"\n",如果我們將其設為"\n\n",就可以使輸出記錄的間隔翻倍。例子就不舉了,大家可以自己試試。個空格分隔記錄(而不換行),將ORS設置成" "。
需要注意的是,使用上面的方法,最多只能處理一個記錄占用三行的文本,象下面一個記錄占據四行的通訊錄,就處理不了了(大家可以試試看):
| wangwu 13512345678 ww@163.com wuhan, hubei |
?要處理這種情況,代碼最好考慮每個記錄的字段數量,并依次打印每個記錄。以下就是修正的代碼:
程序輸出如下:
| ?wangwu 13512345678 ww@163.com wuhan, hubei |
轉載于:https://blog.51cto.com/bubble/1179115
總結
以上是生活随笔為你收集整理的awk详细教程:第二部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《转》java URL重写
- 下一篇: python多线程编程: 条件变量同步