awk 學習(三) 應用示例

2021-06-20 20:28:33 字數 3272 閱讀 3991

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檔案,此檔案各域以冒號作為分隔符,則必...