您好,登錄后才能下訂單哦!
awk 獨立的編程語言 (變量 內置變量 流程控制 函數 數組)
在寫腳本時使用awk獲取數據給程序處理
awk獨立使用時,主要用來對數據做統計
命令格式
awk [選項] '處理動作' 文件列表 (多個文件之間用空格間隔)
命令 | awk [選項] '處理動作'
awk處理數據方式:
以行為處理單位;對數據進行逐行處理
處理完當前行 把當前行的處理結果輸出后自動對一行進行處理
直到處理完文件中所有行為止
默認是逐行讀入數據,逐行處理數據。要想讓awk只處理指定的行。加條件
只有當前行與條件匹配才執行處理動作,反之則不處理
awk [選項] '條件{處理動作}' 文件列表
條件的表示方式:
1/正則表達式/
2數值比較
3字符比較
4邏輯比較
選項
-F 指定分割域時的分割符號。默認分割符號是空格和tab健
awk 內置變量
$0 保存awk當前讀放行的內容
FILENAME 保存awk當前處理文件的文件名
NR 保存awk當前處理的行數
FNR 保存awk當前處理的行在文件中的行數
NF 存放用指定分割符號分割后,當前行,列(域)的個數
$1...$n 表示是用指定的分割符 分割數據后的域
$1 變量第1列 $2 第2列
FS 保存字段分割符號 默認值空格和tab健 (FS=
ENVIRON["系統環境"] (數組類型)調用系統環境變量的值
echo $USER $HOSTNAME
awk '{print ENVIRON["HOSTNAME"]},ENVIRON["USER"]}' a.txt
ENVIRON[“系統環境變量”] 讓awk調用系統環境變量
-v 讓awk使用shell自定義變量
#name=jim
#awk -v mz=$name '{print mz}' a.txt
把awk當前系統已有的用戶名輸出屏幕上 /etc/passwd
awk -F":" '{print NR,$1,$6}' /etc/passwd | head -3
用戶名 家目錄
root/root
bin/bin
daemon /sbin
共處理 3 行
awk 'BEGIN{FS=":";print "行號\t用戶名\t家目錄"}{print NR"\t",$1"\t",$6}END{print "共處理了"NR"行"}' /etc/passwd
awk處理數據順序
BEGIN{ }行前處理: 沒讀入行之前執行的動作
初始化操作都寫在BEGIN{}里
{ } 行處理: 讀入行時執行的動作
對讀放的行做處理
END{ } 行后處理: 行讀完之后執行的動作
做總結性輸出操作寫在END{}里
每一個處理都可以單獨使用,也可以重復使用,也可以一起使用
head -8 /etc/passwd | awk 'BEGIN{print NR}{PRINT NR}END{print NR}'
條件的表示方式:
1、/正則表達式/
awk ‘/正則表達式/{處理動作}' 文件名
awk '/root/{print NR,$0}'/etc/passwd
awk '/[0-9]/{print $0}' /etc/passwd
~不匹配
!~不匹配
awk -F":" '$1~/a/{print $1,$3}' /etc/passwd
awk -F":" '$1!~/a/{print $1,$3}' /etc/passwd
2、數值比較 == != > >= < <=
awk -F":" '$3==0{print $1,$3}' /etc/passwd
awk -F":" '$3<10{print $1,$3}' /etc/passwd
3、字符比較 == !=
awk -F":" '$1!="bin"{print $0}' /etc/passwd
awk -F":" '$1=="root"{print $0}' /etc/passwd
4、邏輯比較(有多個判斷條件時使用)
&& 邏輯與
|| 邏輯或
! 邏輯非
awk -F":" '$3>=5 && $3<=10{print $1,$3}' /etc/passwd
awk -F":" '$3==5 || $3==7{print $1,$3}' /etc/passwd
awk運算符號(與shell里的運算符方式相同)
+ - * / %
+= -= *= /=
++ --
awk里變量的定義與調用
變量名=值
調用 變量名
* 也可以不定義直接調用
awk -F":" 'NR<=3{i=$1;print i}' /etc/passwd
統計內建用戶和外建用戶的個數
awk -F":" 'BEGIN{i=0;j=0}$3>=500{i++}$3<=499{j++}END{print
"inside user "i" 個";print "outside user "j" 個"}' /etc/passwd
awk 流程控制(流程控制的執行過程和shell里流程控制執行過程一樣,只是語法格式變了)
一、分支結構
單分支
if(條件表達式)執行的操作1
if(條件表達式){條件成立時執行的操作1;執行操作2;執行操作N}
雙分支
if(條件表達式){
動作1;動作2;動作N
}
else{
動作1;動作2;動作N
}
awk -F":" '{ if($3<=499){i++}else{j++}}END{print i;print j}' /etc/passwd
多分支
if(條件表達式){
動作1;動作2;動作N
}
else if(條件表達式){
動作1;動作2;動作N
}
......
esle{
動作1;動作2;動作N
}
awk -F":" 'BEGIN{x=0;y=0;z=0}{if($3<100){x++}else if
($3>=100&&$3<=499){y++}else if($3>=500){z++}else{print "no user"}}
END{print x,y,z}' /etc/passwd
調用awk腳本對文件處理
awk -f xxx.awk /etc/passwd
vim xxx.awk
#!/usr/bin/awk -f
BEGIN{
FS=":"
x=0
y=0
z=0
}
{
if($3<=499){
x++
}else{
y++
}
}
END{
print "內建用戶個數是 "x" 個"
print "外建用戶個數是 "y" 個"
}
#chmod +x xxx.awk /etc/passwd
./xxx.awk
二、循環結構
for
for(初值;條件表達式:步長){
條件成立時執行的循環體
}
awk "BEGIN{ for(i=1;i<=10;i++){print i}}"
while 先判斷條件再執行循環體
while(條件表達式){
條件成立時執行循環體
}
awk -F":" '{while( $3<3 ){print $1,$3;}}' /etc/passwd
awk -F":" '{while( $3<3 ){print $1,$3;$3++}' /etc/passwd
awk -F":" '{while( $3<3 ){print $1,$3;$3=5}}' /etc/passwd
do....while 先執行循環體后判斷條件
do{
循環體
}while(條件表達式)
awk 'BEGIN'{i=10:while(i>20){print i;i++}}'
awk 'BEGIN(i=10;do{print i;i--}while(i>20)}'
awk流程控制語句
對awk里的循環結構做執行控制(只要條件成立就執行循環體)
awk數組
break 結束當前所在的循環體
continue 終止本次循環,開始下一次循環
awk 'BEGIN{for(i=1;i<=10;i++){if(i==4)continue;print i}}'
awk 'BEGIN{for(i=1;i<=10;i++){if(i==4)break;print i}'
對awk做控制(逐行讀入數據,逐行處理數據)
exit
終止awk讀入行
如果有END{}就執行END{}里的動作
如果沒有END{}直接結速處理
awk 'NR==4{exit}{print NR,$0}' a.txt
awk 'NR==4{exit}{print NR,$0}END{print NR}' a.txt
next
讓awk讀取當前行的下一行
awk 'NR==4{next}{print NR,$0}END{print NR}' a.txt
awk數組
定義數組格式:數組名[數字元素下標]=元素值
*數組元素的下標可以使用數字或字符
使用數組元素格式: 數組名[數組元素下標]
輸出數組元素的值:print 數組名[數組元素下標]
awk 'BEGIN'{stuname[0]="jim"stuname[1]="tom";print stuname[0];print stuname[1]}'
awk 'BEGIN{ for{i=0;i<=10;i++}{ num[i]=i;print num[i]} }'
awk 'BEGIN{ for(i=0;i<=10;i++){ num[i]=i;print num[2]} }'
awk 'BEGIN{ for(i=0;i<=10;i++){ num[i]=i };print num[2];print num[3] }'
遍歷數組循環結構
for(變量名 in 數組名){print 數組名[變量名]}
for( x in num ){ print x;print num[x]}
awk 'BEGIN{for(i=0;i<=10;i++)num[i]="user"i};for(w in num){print w,num[w]}'
把系統前5個用戶名存儲到數組usergrp里,然后輸出數組usergrp的所有元素
head -5 /etc/passwd | awk -F":" '{print $3,$1}'
head -5 /eetc/passwd | awk -F":" '{print usergrp[$3]=$1}END{for(i in usergrp}{print i,usergrp[i]}}'
統計test.txt 文件里每個命令出現的次數
awk '{comm[$1]++}END{for(x in comm){print x,comm[x]}}' test1.txt | sort -rnk 2
awk '{comm[$1]++}END{for(x in comm){print x,comm[x]}}' ~/.bash_history | sort -rnk 2 | head -10
r 按降序排序
n 按數字排序
k 按第2列排序
ps -e 顯示系統內的所有進程
-o 指定顯示那列的數據
comm 可執行文件名
cmd | 簡單命令
pcpu cpu的占用率
pmem 內存使用率
time 累計的cpu時間
etime 進程啟動后度過的時間
例子
ps -eo comm,pupu,pmem --sort -pmem | head 按內存使用率降序排序
ps -eo comm,pcpu,pmem --sort +pmem | head 按內存使用率升序排序
ps -e -o comm,pcpu | tail -n +2
自動連接ssh服務器腳本
#!/usr/bin/expect
set login_host 192.168.1.1
set login_user root
set login_password 123456
spawn ssh $login_user@login_host
expect "login_user@login_host's password:"
send "$login_password\r"
expect "#"
send "useradd jim9\r"
expect "#"
send "exit"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。