awk簡單內建變數的使用
awk 'nr==fnr nr > fnr'a b
輸入檔案a和b,由於先掃瞄a,所以掃瞄a的時候必然有nr==fnr,然後掃瞄b的時候,fnr從1開始計數,而nr則接著a的行數繼續計數,所以nr> fnr
nr 已經讀出的記錄數
fnr 當前檔案的記錄數
fs 輸入字段分隔符(預設為:space:),相當於-f選項
awk -f ':' ''a 和 awk 'begin' a是一樣的
ofs輸出字段分隔符(預設為:space:)
awk -f ':' 'begin' b
如果cat b為
1:2:3
4:5:6
那麼把ofs設定成";"後就會輸出
1;2;3
4;5;6
nf:當前記錄中的字段個數
awk -f ':' '' b的輸出為 3
3表明b的每一行用分隔符":"分割後都3個字段
可以用nf來控制輸出符合要求的字段數的行,這樣可以處理掉一些異常的行
awk -f ':' '' b
rs:輸入記錄分隔符,預設為"\n"
預設情況下,awk把一行看作乙個記錄;如果設定了rs,那麼awk按照rs來分割記錄
例如,如果檔案c,cat c為
hello world; i want to go swimming tomorrow;hiahia
執行 awk 'begin ' c 的結果為
hello world
i want to go swimming tomorrow
hiahia
合理的使用rs和fs可以使得awk處理更多模式的文件,例如可以一次處理多行,例如文件d cat d的輸出為
1 23 4 5 \n
6 78 9 10
11 12 \n
hello
每個記錄使用空行分割,每個字段使用換行符分割,這樣的awk也很好寫
awk 'begin ' d 輸出 2
3 1ors:輸出記錄分隔符,預設為換行符,控制每個print語句後的輸出符號
awk 'begin ' d 輸出
2;3;1
搜尋有關鍵字kehuanyu的所有行,沒有指定action
kehuanyu@coship:~/test/mmcp/awktest$ awk -f ":" '/kehuanyu/' password
kehuanyu:x:1005:1004:柯環宇:/home/kehuanyu:/bin/bash
搜尋有關鍵字kehuanyu的所有行,並顯示對應的shell,指定action ,列印出shell
kehuanyu@coship:~/test/mmcp/awktest$ awk -f ":" '/kehuanyu/ ' password
/bin/bash
列印出系統最後幾名登陸者
kehuanyu@coship:~/test/mmcp/awktest$ last -n 8 |awk ''
yangxian
guriyu
zhangjun
zhangjun
jiangxia
liulili
jiangxia
jiangxia
又如:kehuanyu@coship:~/test/mmcp/awktest$ last -n 8 |awk ''
yangxian pts/56
guriyu pts/49
zhangjun pts/4
zhangjun pts/41
jiangxia pts/27
liulili pts/11
jiangxia pts/48
jiangxia pts/31
自定義變數
kehuanyu@coship:~/test/mmcp/awktest$ awk ' end' password
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
.........
huangyanliang:x:1045:1045::/home/huangyanliang:/bin/bash
xuyuanchu:x:1046:1046::/home/xuyuanchu:/bin/bash
user count is 71
等同於awk 'begin end' password
統計某個資料夾下的檔案占用的位元組數
kehuanyu@coship:~/test/mmcp/awktest$ ls -l |awk 'begin end'
[end]size is 3657
變數名只能包含字母、數字和下劃線,而且不能以數字開頭
awk關係、布林運算子、表示式
運算子 意義;
< 小於
> 大於
<= 小於等於
>= 大於等於
== 等於
!= 不等於
~ 匹配正規表示式
!~ 不匹配正規表示式
|| 邏輯或
&& 邏輯與
! 邏輯非
運算子 意義
+ 加- 減* 乘
/ 除% 模
^或** 乘方
++x 在返回x值之前,x變數加1
x++ 在返回x值之後,x變數加1
1. 正規表示式
awk 'begin $0~/root/' passwd (在passwd檔案中查詢 以:為分割符,全域$0與root(這個是正規表示式)匹配的行)
結果:root:x:0:0:root:/root:/bin/bash
awk 'begin $0!~/root/' passwd (在passwd中查詢 全域 不與root匹配的行)
2. 運算子
awk 'begin ' passwd (將第三域 或者 第四域 包含7 的記錄列印出來)
備註:~ 與 = 區別是: = 表示某個域或者說某個字段 與值7對比;而 ~是表示正規表示式 匹配的是字串;對應不匹配應該協作 !~ ,如awk 'begin '
// 來包含匹配的字串
awk陣列,函式,shell與awk混合程式設計後續慢慢研究。
awk學習示例
sed和 awk一直是文字分析的神器,最近學習了陳皓的兩篇博文,小試牛刀如下。1.背景 有些map reduce 資料產出之後,對於 value 數量不足的記錄,要求在資料端予以補全。在這裡,我們要求每條記錄中有10個 value 用逗號,進行分隔。對於補全之後的結果,是不是可以保證每條記錄中有10...
awk程式設計基本使用示例
對於每一行,如果第三列大於0,則列印第一列,第二列 第三列的值 awk 3 0 file1 file2 f指定執行程式的檔案 awk f programfile inputfile 列印整行輸入 awk 或者 awk nr當前行數,nf當前行的列數,下面這個 是列印當前行的列數,第一列和最後一列 a...
awk應用小結
awk 呼叫 第一種方式 命令列方式 awk f field separator commands input file s f域分隔符 是可選的,因為awk使用空格作為預設的域分隔符,因此如果要瀏覽域間有空格的文字,不必指定這個選項,如果要瀏覽諸如passwd檔案,此檔案各域以冒號作為分隔符,則必...