AWK
1、AWK介紹
全稱:Aho Weinberger kernaighan 三個人的首字母縮寫
1970 年第一次出現在Unix機器上,后面再開源領域使用它;
所以,我們在Linux中使用,改用GUN AWK;所以,在Linux上實際上叫做gawk;
grep 行過濾器
-o -i -v -e grep egrep fgrep
sed 流編輯器
-n p 1、地址定界 3,5 3行到5行 2、sed的命令 p打印 a i w c s/pattern/str支持正則表達式匹配
AWK 報告生成器
通過默認匹配以及自身的語言格式
[默認情況下,三個工具都不支持編輯源文件]
2、AWK原理
3、AWK用法
AWK 【option】`awk自己的固定語法語句` FILE……
AWK [option] ...|`program` FILE
1、program 必須使用單引號 ``
2、多條program 語句使用大括號包含起來,可以並列,可以嵌套
awk`{print}` /etc/passwd
4、option
-F 指定分隔符
AWK -F [/:] `{print $1,$3} a.txt`
其中【】 內表示多個字符中的1任意一個
-v 因為AWK是一種語言編譯器,能自己定義變量,同時也有內置變量(與環境變量類似)
手動指定變量參數
awk -v a="a/b" `{print a}` a.txt
給a賦值,打印a這個變量
1、a是自定義變量 -v FS=":"
2、在awk中調用變量,不用加$符號
5、AWK自己的固定語法
1、print
默認輸出(在屏幕上)
在awk中沒有保存命令,我們可以關聯別的命令來保存awk的結果
awk `{a="a/b";print a}` a.txt|tee a.bak
2、printf-----格式化輸出
printf “%s是%d班學的最好的學生”,變量1,變量2
【僅僅只有順序關系】
格式符
%s字符串
%d %i數值
%i數值
%E科學計數法
%cASC||碼值
%f浮點數
%u無符號整數
%%逃逸符 只顯示%自己
%
修飾符
默認為右對齊
-代表左對齊
%5.4f
5 所占位符
4 所去小數位
sed 、pATH/PATH2/
3、變量(內置變量、自定義變量)
內置變量--環境變量(bash)(env set -C +C)
awk 語言所默認支持的變量
FS 定義輸入分隔符的變量
OFS 定義輸出分隔符的變量
NF 定義分隔以后的參數個數($NF 分隔以后最后一行變量)
*變量引用的時候,不加$,$1....$n
awk `{print NR}` /etc/fstab /etc/passwd
awk `{print FNR}` /etc/fstab /etc/passwd
存儲文件的名字
awk `{print FILENAME}`/etc/passwd
awk `{print FILENAME}` /etc/passwd
ARGC 整個命令的段數 【注意:數組中不包含‘program’本身】
ARGV 數組 用來調取命令中,指定的ARGC的字段
RS 指定換行符\n可以指定新的換行符,不影響本身的換行
ORS 輸出的時候指定的換行符,默認換行符指定默認字符
awk -v RS =""{print}
4、模式匹配(地址定界)
1、空值,沒有定義,默認就將文件中所有的行,放入awk進行循環
2、對固定的1、3行進行操作
sed -n `1,3p`/etc/passwd
awk `1,3{print}` /etc/passwd ?/?默認不支持使用1-3,1,3等等,這樣數值的直接寫法;
awk `NR>=1&&<=3;{print}` /etc/passwd
3、/pattern/,/
sed /pat1/p /etc/passwd
awk '/r..ter/{print}' /etc/passwd
4、/pat1/./pat2 第一次匹配Pat1到Pat2的
5、模式匹配可以直接使用判斷語句
awk -F :'$NF=="/bin/bash"{print $1,$3}'/etc/passwd
6、BIGEIN|END 語句
BIGEIN定義在默認循環進行操作前所要執行的語句;
awk -F:'BEGIN{printf“shell程序為bash的用戶為:\n”}$NF=="/bin.bash"{print $1,$3}' /etc/passwd
awk -F:'BEGIN{printf“shell程序為bash的用戶為:\n”}$NF=="/bin.bash"{print $1,$3}'END{print "end"} /etc/passwd
5、操作符
運算操作符:
+-*/ %(取余、取模)** //(取整)
比較運算符:
== ! = <> =<=
~!~
邏輯操作符:
&&
||
!
賦值運算:
= += -= /= *= %= ^= //=
條件表達式:
條件語句? 條件成立語句;條件不成立語句
awk '/^title/{FN<=2? print;printf"參數\n"}' /boot/grub/grub.conf
6、常見(action)
print printf 以及它任何命令的操作都是action
1、expressions
2、control statement 控制語句 例如:if while
邏輯關系語句判斷來進行結和
3、語句組合 compound statements
4、Input statements 輸入語句
5、output statements 輸出語句
7、常見語言(if while do for break continue delete switch)
1、if語句
語法格式:if(條件表達式){執行語句}
if (條件表達式){執行語句}else{執行語句}
awk ‘/^title/{if(Fn<=2){print}else{print " 參數過少"}}’/boot/grub/grub.conf
awk '/^title/{if(NF>=2) print $4}' /boot/grub/grub.conf
2、while
只有對參數進行遍歷的時候才會使用循環;
例題:awk '/^[[:space:]]*kernel\>/{print}' grub.conf
語法格式:
只有對行參數進行
3、for語句
語法格式:for(初始值;條件判斷;初始值控制語句){循環體}
awk '/^[:space:]]*kernel\>/{for(i=0;i<=NF;i++){print $i"\t";print length($i)}}' grub.conf
循環建議用for循環
在awk中,for也可以使用和shell中一樣的格式:
回顧:
for (i in 列表){循環體}
echo "wsl is good boy" | awk 'for i in{$i}'
例題:
4、do -while 循環
語法:do {循環體} while (循環條件)
注意和while的區別:while語句只有在滿足條件的時候,才會進入循環,而do while 會先執行循環體一次,在進行判斷;
5、循環跳出語句
break 【n】跳出n次循環
continue 跳出本次循環
next 跳出默認的當次循環
NR%2==1 next
awk `{if(NR%2==1){else {print}}}` /etc/passwd
6、switch 類似於case
語法格式:switch (expression){caseVALUE1 or /REGXP/: statement;case VALUE2 or /REGEXP2/:statement;……default;statemwnt}
switch(表達式){case 模式匹配值:執行語句;case模式值:執行語句;case模式匹配值:執行語句,}
8、數組
在awk中,數組和shell中數組特性相同
注意:awk中數組不用定義,只要使用了,就有值為空的默認數組;這樣做數據統計的時候非常常見!!!!!!
行遍歷---實際上就是整個文件的遍歷
列遍歷---取對象固定某列的中的,相同數據的統計。
注意:數組通過for語句,在給其他變量進行賦值的時候,賦值的index索引信息;
練習:
awk '{for (i=1;i<=N;i++){count[4i++]}}end{for(i in count){print 1,count[i]}}' /etc/fstab
9、函數
1、內置函數:
函數調用:function(參數)
length($1)
數學運算上使用的函數 sin()cos()cot()tan()
sub(x,x,x)替換第一個匹配到的值
gsub(x,x,x)替換該行所匹配到的所有值
split(x,x,x)指定分隔符去切割文件。
---------------------------------------------------------------------------------------------------------------------
chroot
切換系統目錄
/--/dev/sda1
原來的操作系統的shell程序切換到一個新的目錄下面去,然后再在這個目錄下面放置相應系統啟動需要的程序文件。
拓展:
虛擬化准備知識:系統的啟動原理
讀取系統--讀取磁盤:前提就是必須現價載磁盤的驅動程序
掛載 虛擬根(img虛根文件ramdisk)
虛根文件文件掛上以后,在grub1.4
通過chroot將ramdisk 上面的臨時“根”切換到磁盤上面
···················································································································