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