shell編程----shell對輸出流的輸出,awk命令

awk介紹

awk是一種可以處理數據、產生格式化報表的語言,功能十分強大,awk認爲文件中每一行是一條記錄,記錄與記錄的分隔符爲換行符,每一列是一個字段,字段與字段的分隔符默認是一個或多個空格或tab製表符。

awk的工作方式是讀取數據,將每一行視爲一條記錄,每條記錄以字段分隔符分成若干字段,然後輸出各個字段的值

awk語法:awk [options][BEGIN]{program}[END][file]

常用命令選項:

-F fs 指定描繪一行中數據字段的文件分隔符,默認爲空格

-f file  指定書讀程序的文件名

-v var=value  定義awk程序中使用的變量和默認值

注意:awk程序腳本由左大括號和右大括號定義,腳本命令必須放置在兩個大括號之間。

awk程序運行優先級是:

1) BEGIN:在開始處理數據流之前執行,可選項

2) program:如何處理數據,必選項

3) END:處理完數據流後執行,可選項

awk基本用法-awk數據提取功能

學習用例,數據源test.txt

1> awk對字段(列)的提取

字段提取:提取一個文本中的一列數據並打印輸出

字段相關內置變量

$0  表示整行文本

$1  表示文本中的第一個數據字段

$2  表示文本中的第二個數據字段

$N  表示文本中的第N個數據字段

$NF  表示文本中的最後一個數據字段

1) awk '{print $0}' test.txt  讀入text.txt每行數據並把每行數據打印出來

2) awk '{print $NF}' test.txt  讀入text.txt每行數據並打印最後一列

3) awk '{print $3}' test.txt  讀入text.txt每行數據並打印第三列

2> awk對記錄(行)的提取

記錄提取:提取一個文本中的一行並且打印輸出

記錄的提取方式有兩種:a、通過行號b、通過正則匹配

記錄相關內置變量

NR:指定行號

1) awk 'NR==3{print $0}' test.txt    獲取test.txt第三行數據

 2) awk -F ":" 'NR==1{print $1,$3,$5}'  /etc/passwd 獲取/etc/passwd第一行中第1、3、5列的數據,/etc/passwd中的字段以:作爲分隔符,所以需要指定分隔符:

3> awk程序的優先級

關於awk程序的執行優先級,BEGIN是優先級最高的代碼塊,是在執行PROGRAM之前執行的,不需要提供數據源,因爲不涉及到任何數據的處理,也不依賴與PROGRAM代碼塊;OROGRAM是對數據流做操作,是必選的代碼塊,也是默認的代碼塊,所以在執行的時候必須提供數據源;END是處理完數據流之後的操作,如果需要執行END代碼塊,就必須需要PROGRAM的支持,單個無法執行

1) awk 'BEGIN{print "hello lavender"}{print $0}END{print "bye lavender"}' test.txt

2) awk 'BEGIN{print "hello lavender"}'     不需要數據源  可以直接執行

3) awk '{print "hello lavender"}'      awk 'END{print "hello lavender"}'  沒有提供數據流,所以無法執行

4) awk '{print "hello lavender"}'  test.txt

awk高級用法

1> awk定義數組

數組定義方式:數組名[索引]=值

awk 'BEGIN{array[0]=100;array[1]=200;print array[0],array[1]}'

awk中可以定義變量   head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}'  計算內存使用率

2> awk運算 

1. 賦值運算  =

2. 比較運算 > >= == < <= !=

3. 數學運算 + - * / % ** ++ --

4. 邏輯運算 && ||

5. 匹配運算 ~ !~

1) 賦值運算,見上面的變量和數組定義

2) 比較運算 如果比較的字符串則按ascii編碼順序比較,如果結果返回爲真則用1表示,如果返回爲假則用0表示

3) 數學運算

4) 邏輯運算

5) 匹配運算

 

3> awk環境變量

FIELDWIDTHS   以空格分隔的數字列表,用空格定義每個數據字段的精確寬度

FS                       輸入字段分隔符號

OFS                    輸出字段分隔符號

RS                      輸入記錄分隔符

ORS                   輸出記錄分隔符號

awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $1,$3,$5}' /etc/passwd

4> 流程控制

1. if判斷語句

2. for循環語句

3. while循環語句

4. do...while語句

5. 循環控制

學習用例;num.txt

1) 打印$1大於5的行

2) 累加

awk小技巧

1> 打印test.txt文本中的行數 awk 'END{print NR}' test.txt

 2> 打印test.txt文本最後一行的內容 awk 'END{print $0}' test.txt

3> 打印test.txt文本中的總列數 awk 'END{print NF}' test.txt

學習視頻:https://www.bilibili.com/video/BV1vE41127wm?p=28

https://www.bilibili.com/video/BV1vE41127wm?p=29

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