awk是一個文本處理器,主要用於格式化文檔輸出html
awk命令express
格式:awk [option] ‘program’ file (命令,選項,命令主體,文件)
命令主體部分:[/模式/]{動做} (命令主體部分應該用單引號引發來)
模式部分無關緊要:是用來決定什麼時候觸發awk,以及怎麼觸發
動做部分:決定怎麼處理數據,須要將動做放到"{ }"中
選項部分:
-f,--file program-file:從指定的文件中加載program語句塊,而不是經過命令行給出相關的程序內容;
-F,--field-separator fs:指定字段的輸入分隔符;默認是空白字符;
-v,--assign var=val:用於聲明自定義變量併爲變量賦值;數組
awk中的一些概念:
a.分隔符:
輸入分隔符:awk處理數據時,會根據特定的標識符號把數據分段,這種標識符就是輸入分隔符,默認爲空白符
輸出分隔符:將數據處理完成後,會用分隔符將這些分段的數據鏈接起來,這樣的分隔符叫輸出分隔符;默認也爲空白符;bash
b.記錄 awk處理數據時,用換行符分開的每一行就是一個記錄,一般用$0表示 c.字段 awk用分隔符將一個記錄分紅若干個字段,字段分別用$1,$2,$3,....$NF表示($NF用來表示最後一個字段)
3.awk的工做原理:
1.awk首先會執行BEGIN{動做。。。}語塊中的語句
2.awk而後會執行/模式/{動做。。。}語塊內的語句
3.awk最後會執行END{動做。。。}語塊內的語句
注意:
1) BEGIN語句塊在awk開始處理數據內容以前就被執行;一般用於生成表頭;此語句塊是可選語句塊;
2) END語句塊在處理完全部的數據以後,纔會被執行;一般用於數據彙總;此語句塊是可選語句塊;
3)/模式/ {動做}語句塊特別重要,其模式語句塊不能省略,可是其動做語句能夠省略,若省略默認執行print命令
4.awk的用法
內建變量:(awk本身定義的變量,每一個變量都有其不一樣的功能)
FS:輸入字段分隔符,默認空白符ide
[root@bogon html]# awk -v FS=: '{print $1,$2}' /etc/passwd root x
`使用 : 做爲分隔符而且輸出第一第二字段,注意變量必須使用 -v 聲明 OFS:輸出字段分隔符,默認空白符
[root@bogon html]# awk -v FS=: -v OFS="--" '{print $1,$2}' /etc/passwd
root--x命令行
```修改輸出分隔符
RS:輸入換行符,用來分隔記錄的code
[root@bogon html]# awk -v RS="/" '{print $0}' /etc/passwd root:x:0:0:root: root: bin bash
ORS:輸出換行符,用來決定記錄如何輸出
[root@bogon html]# awk -v ORS="------" '{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash------bin
NF:每一行字段的總數
root@bogon html]# awk -F : '{print NF}' /etc/passwd 7 //顯示一行內字段的總數 [root@bogon html]# awk -F : '{print $NF}' /etc/passwd /bin/bash //顯示最後一個字段
NR:行的總數,能夠看作每一行的行號
[root@bogon html]# awk -F : '{print NR}' /etc/passwd 1 2 3 //顯示各行的行號 [root@bogon html]# awk -F : '{print $NR}' /etc/passwd root //第一行的第一個記錄 x //第二行的第二個記錄 2 4 lp /sbin /sbin/shutdown //第七行的第七個記錄 //能夠看出NR是根據行變化而變化的
FNR:能夠處理多個文件,並分別顯示他們的行 FILENAME:正在被處理的文件的文件名字
[root@bogon html]# awk '{print FILENAME}' /etc/passwd /etc/passwd /etc/passwd //由於awk是一行一行的處理文本的,因此爲了不重複,咱們可使用END{動做}來總結
ARGC:命令行內參數的數量
[root@bogon html]# awk 'END{print ARGC}' /etc/passwd 2 //包括awk命令自己,但不包括awk命令的選項部分和program部分 因此爲2
ARGV:由命令行參數構成的數組
[root@bogon html]# awk 'END{print ARGV[1]}' /etc/passwd /etc/passwd [root@bogon html]# awk 'END{print ARGV[0]}' /etc/passwd awk
4.自定義變量 定義方式 -v 名字=值 示例
[root@bogon html]# awk -v var=www -F : '{print $1,var}' /etc/passwd root www //注意:在引用變量時不須要添加$符號,不然引用的是$0
4.常見的動做
print:以標準的格式輸出 ‘’{print itm1,itm2}‘’
注意:各item之間用逗號隔開
item能夠是數字,字符串,變量,字段,還能夠是awk的表達式
默認的item是$0
若各item用空格隔開或沒隔開,則輸出的結果將不會有輸出分隔符htm
printf:格式化輸出 '{printf "格式" item1,item2...}' 注意:printf的格式沒有自動換行,因此須要在格式末尾添加\n printf必須給出格式 "格式"須要爲後面的每個item單獨指定一個格式化符號,若不指定則不會輸出未指定的那一列 格式與item也須要使用逗號隔開 常見的格式: %c:以ASCII碼錶中的內容顯示字符信息; %d, %i:顯示十進制整數; %e, %E:以科學計數法來顯示數字;浮點類型; %f, %F:顯示十進制數字的浮點形式; %g, %G:以科學計數法顯示浮點數字; %u:顯示無符號十進制數; %s:顯示字符串; %x, %X:顯示無符號的十六進制整數; %%:顯示%; #[.#]:第一個數字用來控制顯示寬度;第二個數字表示小數點的精度; 如:%5s, $8.3f -:表示採用左對齊方式顯示;默認是右對齊; +:顯示數字的正負符號;
[root@bogon html]# awk -F: '{printf "%20s : %3s :%-+10s\n",$1,$2,$3}' /etc/passwd root : x :0 bin : x :1 //注意:#【.#】 + - ,也應該放到%後面
5.操做符:
算術運算操做符:
雙目運算符:
x+y, x-y, x*y, x/y, x^y, x%y文檔
[root@bogon html]# awk 'END{print 5-4,5^2}' /etc/passwd 1 25
單目運算符: -x:將正整數轉換爲負整數; +x:將字符串轉換爲數值; 字符串操做符: 無任何操做符號時,即爲字符串鏈接操做; 賦值操做符: =, +=, -=, *=, /=, ^=, %= ++, -- 比較操做符: ==, !=, >, >=, <, <=
[root@bogon html]# awk -F: '$3==1{print $1}' /etc/passwd bin //如果字符串比較須要加引號
模式匹配操做符: ~:操做符左側的字符串是否可以被右側的PATTERN所匹配; !~:操做符左側的字符串是否不能被右側的PATTERN所匹配;
[root@bogon html]# awk -F: '$1~/root/{print $1,$3}' /etc/passwd root 0 //PATTERN須要用雙斜線擴住
邏輯運算操做符: && || ! 示例: ~]# awk -F: '$3>=1000&&$3<=1100{print $0}' /etc/passwd 條件表達式: selector(condition)?if-true-expression:if-false-expression
[root@bogon html]# awk -F: '{$1=="root"?type="super":type="laji";print $1,type}' /etc/passwd root super bin laji //注意:變量賦值加引號
6.program的模式部分
1.啥也不寫:處理每一行
2.模式內輸入一些,內容或者關係表達式,能夠在前面加入!選擇不匹配
3.能夠用NR的範圍肯定行的範圍
4.倆個模式用逗號隔開,能夠匹配範圍內行字符串