awk起源:awk語句是70年代由BELL實驗室三個研究人員開發出來的一套語言,awk的名字就是這三位研究人員的名字頭字母。但是最初的awk並不是面向使用者使用,而是商業化,面向個人使用,但awk依然是一套強大的語言。
90年代,GNU在awk基礎上開發出完全開源版本,功能更加強大強大,甚至可以通過ftp來網路應用
awk語句是一種非常強大的語句,它的功能異常強大,甚至可以當作一門程式設計語言來使用,在以後會經常用到awk語句來處理字元。在shell指令碼裡,awk可以說是核心之一,因為剛接觸awk語句,所以,先寫下這篇初級awk語句的學習感受。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
awk使用格式:
awk [option] 'pattern {action}'
pattern : /regexp/ //Regex
exp //運算式
BEGIN
END
action : print //對文本切片,$1,....,$N
FS: //讀入檔案是以什麼作為分割符,預設空格符
RS: // 分行符號, /n
OFS //輸出的段分隔字元
ORS //輸出的行一行間隔符
NF //一個行裡切開有多少個斷
NR //行號當前在第幾個行
awk -F: //可以指定輸入的時候分割符是“:”,也可以指定別的
舉兩個例子來顯示awk語句的強大:
1.顯示當前系統上所有其VSZ段的值大於4000的進程的進程名字、進程號和VSZ值的大小;
ps aux |awk '$5>4000 {print $2 "\t" $5 "\t" $11}' |grep -v "PID"
##將ps 進程資訊交給awk命令來處理,預設以空格來作為分隔字元,如果第5個欄位的值大於4000,就顯示第2 , 3,5個欄位,並且交給grep來處理,列印出沒有"PID"的項。
看到了嗎,這條awk語句的pattern項,為一個運算式:$5>4000, 在awk裡,pttern可是是Regex,運算式,用好這個條件,可以快速匹配出想要得到的文本,而不需要用grep或##者sed去抓取命令。而後面的$2,$5指的是第2,5個欄位,\t是定位字元。
2.顯示linuxer1-linuxer20每個使用者名稱及對應的UID號碼和GID號碼
##做這個練習前需先建立使用者linuxer1-linuxer20
grep "linuxer$I" $FILE | awk 'BEGIN{FS=":"}{print $1",UID:" $3",GID:"$4}'
#BEGIN的用法:BEGIN{} {}指,在後面的命令執行前,先準備好BEGIN{}裡的內容,即先執行BEGIN裡的內容,後執行action,而END則恰好相反
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
until迴圈:until迴圈和while迴圈有一定的區別如下:
until CONDITION ; do
...
...
done
#當CONDITION為假時,進行迴圈,直到為真,這樣就可以指定一個條件,如果符合這個條件則,一直迴圈下去,直到不符合這個條件為止。
寫一個指令碼:
查看redhat使用者是否登入了系統,如果登入了,就通知當前指令碼執行者“redhat is logged on.”;
否則,就睡眠5秒鐘後再次進行測試;直到其登入狀態止退出;
要求:使用until迴圈
#sleep 5 睡眠5秒
#wall " " 向所有人通告“ ”
#!/bin/bash#who | grep "redhat" &> /dev/null //抓取當前登入使用者裡,是否有redhatWHO=$? //上一條語句執行是否成功,成功WHO為0until [ $WHO -eq 0 ];do //除非變數WHO的值為0,否則一直執行迴圈體 sleep 5 who | grep "redhat" &> /dev/null WHO=$? //再次測試,防止死迴圈done wall "redhat is logged on"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test語句
指令碼條件判斷
test express
test 語句重要用於程式執行流或者其他可以附加條件的語句,成為他們的 condition, 這樣豐富了指令碼的靈活度。
它的格式:
[ expression ] //必須有空格,複製語法錯誤
[[ expression ]]
條件測試:
整數測試
-lt, [ $A -lt $B ] //A是否小於B
-le 小於或等於
-gt 大於
-ge 大於或等於
-nq 等於
-ne 不等於
字串測試
== //等號左右要有空格 'w' 字串用單引號,變數用“” == 兩邊有空格
!=
>
<
-z //判斷一個字串是否為空白 空為真,不空位假 [ -z $A]
-n //與-z相反
檔案測試
-e FILE //判斷一個檔案是否存在
-f //是否是普通檔案
-d //是否是目錄
-h/-L //判斷是否是符號連結檔案或軟串連
-r //是否可讀 目前使用者
-w 可寫 對目前使用者
-x 執行 對目前使用者來講是否有可執行
-s //存在且大小不為0
-O //判斷指令碼的發起者是不是檔案的屬主
-G //是不是有效屬組
例如上面例子裡的until [ $WHO -eq 0 ]; -eq來測試是否等於0