awk基本用法及案例詳解

0 引言

   awk是一個強大的文本分析工具,把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行分析處理。

 awk工作原理:

  #awk -F : '{print $1,$3}' /etc/passwd

  (1)  awk使用一行作爲輸入,並將這一行賦給內部變量$0,每一行也可稱爲一個記錄,以換行符結束

 (2)然後行被:(默認是空格或製表符)分解成字段(或域),每個字段存儲在已編號的變量中,從$1開始,最多可達100個字段

 (3)awk如何知道用空格分隔字段的呢?因爲內部有個變量FS來確定字段分隔符。初始時FS賦值爲空格

 (4)awk打印字段時候,將以設置的方法使用print函數打印,awk在打印字段間加上空格,因爲$1,$3之間有一個逗號,逗號比較特殊,它映射爲另一個內部變量,成爲輸出 字段分隔符OFS,OFS默認爲空格。(所以輸出不加指明的話,默認都是以空格輸出)。如果需要自己指定輸出分隔符,需要“”(必須雙引號)引起來。
 
 (5)awk輸出之後,將從文件中獲取另一行,並將其存儲在$0中,覆蓋原來的內容,然後將新的字符串分割成字段進行處理,該過程將持續到所有行處理完畢。

1 awk的基本用法

  •     awk [選項參數] ‘pattern1{action1}  pattern2{action2}...’ filename
  •     pattern:表示AWK在數據中查找的內容,就是匹配模式
  •    action:在找到匹配內容時所執行的一系列命令。注意是放在{}中的

2  選項參數說明

選項參數

功能

-F

指定輸入文件拆分的分隔符

-V

賦值一個用戶定義變量(定義一個變量)

3 案例操作

    數據準備:

cat /etc/passwd >/home/centos/dan_test/password

(1)搜索passwd文件以root關鍵字開頭的所有行,並輸出該行的第7列。

[root@bigdata3 dan_test]# grep '^root' password | awk -F : '{print $7}'

[root@bigdata3 dan_test]# awk -F : '/^root/ {print $7}' password

(2)搜索passwd文件以root關鍵字開頭的所有行,並輸出該行的第1列和第7列,中間以“,”號分割。

[root@bigdata3 dan_test]# awk -F : '/^root/ {print $7","$1}' password

(3)只顯示/etc/passwd的第一列和第七列,以逗號分割,且在所有行前面添加列名user,shell在最後一行添加"dandan ge,/ni/zuishuai"。

[root@bigdata3 dan_test]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "dandan ge,/ni/zuishuai"}' password

注意:BEGIN ,END理解爲兩個關鍵字

(4)將password文件中的用戶id增加數值1並輸出

   cat password

用戶id爲第三列

[root@bigdata3 dan_test]# awk -v i=1 -F : '{print $3 + i}' password

使用-v定義變量,注意引用時候該定義的變量前面無$符號。

4 awk的內置變量

變量 說明
FILENAME 文件名
NR 已讀的記錄數(行號)
NF 瀏覽記錄的域的個數(切割後列的個數)

案例操作:

(1)統計password文件名,每行的行號,每行的列數

[root@bigdata3 dan_test]# awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' password

(2)切割IP

查看數據的格式:

[root@bigdata3 dan_test]# ifconfig eth0

  [root@bigdata3 dan_test]# ifconfig eth0 | sed -n '2p' | awk '{print $2}'

注意:awk默認是空格切割,因此這裏沒有指定切割的分隔符

sed -n '2p':表示取第二行數據

(3)查詢sed.txt中空行所在的行號

[root@bigdata3 dan_test]# awk '/^$/{print NR}' sed.txt

(4)有文件chengji.txt內容如下:

張三 40

李四 50

王五 60

使用Linux命令計算第二列的和並輸出

[root@bigdata3 dan_test]# cat chengji.txt | awk '{sum=$2+sum} END{print sum}'

(5)輸出分割符以逗號分割

[root@bigdata3 dan_test]# cat password | awk -F : '{print $1","$3}'

默認:

[root@bigdata3 dan_test]# cat password | awk -F : '{print $1,$3}'

截取整數

[root@bigdata3 dan_test]# echo "123abc abc123 123abcdef" |xargs -n1 | awk '{print +$0}'

xargs -n1的理解通過下面的例子理解:

[root@bigdata3 dan_test]# echo "123abc abc123 123abcdef" |xargs -n1

[root@bigdata3 dan_test]# echo "123abc abc123 123abcdef" |xargs -n2

[root@bigdata3 dan_test]# echo "123abc abc123 123abcdef" |xargs -n3

總結:xargs的-n參數

  • (1)-n num 後面加次數,表示命令在執行的時候一次用的argument的個數,默認是用所有的。其實就是表示一次輸入(傳遞)的參數個數。
  • (2)-n參數可以將多行變一行,可以將單行變多行,有點類似hive中的udaf及udtf函數。
  • (3)awk '{print +$0}'只顯示字符串最前面的數字。
[root@bigdata3 dan_test]# echo "1.23a123 a123a1bc abc123 123abcdef" |xargs -n1 | awk '{print +$0}'
1.23

0

0

123

注意與int()函數的區別:

[root@bigdata3 dan_test]# echo "1.23a123 a123a1bc abc123 123abcdef" |xargs -n1 | awk '{print int($0)}'
1

0

0

123

 

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