摘要:一簡介如何展示文本內容,不在于修改文件,同樣也是一行一行讀入文件格式選項指明輸入時用到的字段分隔符自定義變量模式匹配到相應的行,不標注時匹配整個文件匹配到匹配的行時,所要做的動作。
一:簡介
如何展示文本內容,不在于修改文件,
同樣也是一行一行讀入文件
格式:
awk [options] ‘program’ file
option選項:
-F 指明輸入時用到的字段分隔符 -v var=value 自定義變量
program模式: pattern{action .....}
pattern:匹配到相應的行,不標注時匹配整個文件 action: 匹配到匹配的行時,所要做的動作。常用的為打印 print printf(更復雜的打印時使用此選項)
eg:
awk –F: ‘{print $1,$2}’ /etc/passwd
awk -F: "{print $1" "$5}" /etc/passwd
“t” 表示tab鍵
awk -F: "{printf $1" "$5"n"}" /etc/passwd
printf 打印默認不支持換行,需要增加n
謹記:printf 打印內容時,變量不加”” 。二:awk變量(內置):
多練習方可熟練使用
配合 –v使用
FS:輸入字段分隔符,默認為空白字符
awk-v FS=":" "{print $1,FS,$3}’ /etc/passwd
OFS:輸出字段分隔符,默認為空白字符
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
NF:字段數量
NR:行號
FNR:各文件分別計數,行號
FILENAME:當前文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
以下為變量的各個使用舉例:
bash中定義的變量在awd中同樣可以直接拿來使用
NR 行號
FNR 各個文件 分別計數
NF 分割的字段數量,此變量可用于數組
NF和$結合起來有更好的妙用 $NF print里面同樣支持數值運算3)FILENAME:當前文件名
ARGC:命令行參數的個數,,,其中’program’ 不算參數
awk 和最后跟的文件才算參數,由以下例子可以看出此節
1)-v var=value
2) 在program中直接定義外部內部定義都OK
舉例:
awk-v test="hello gawk" "{print test}" /etc/fstab
awk-v test="hello gawk" "BEGIN{print test}"
awk"BEGIN{test="hello,gawk";printtest}"
awk–F:‘{sex=“male”;print$1,sex,age;age=18}’ /etc/passwd
在printf中未加”” 的字符串,printf都默認識別為變量
默認不換行,要換行加上n
格式:
格式要用””引起來
%c: 顯示字符的ASCII碼
%d,: 顯示十進制整數
%f:顯示為浮點數
%s:顯示字符串
%%: 顯示%自身
修飾符:
(#.#)第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
-: 左對齊(默認右對齊)%-15s,,15表示寬度
+:顯示數值的正負符號%+d
修飾符一般寫在格式中間,為了進一步描述格式
格式和修飾符都是為了修飾后面變量打印的格式
應用舉例:
1)格式
%s %d n 字符寬度的綜合使用
左對齊寬度為25字符
2)增加字符串顯示
2:操作符:算術操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉換為負數
+x: 轉換為數值
賦值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比較操作符:
==, !=,>, >=, <, <=
邏輯操作符:與&&,或||,非!
示例:
?awk –F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd
?awk -F: "$3==0 || $3>=1000 {print $1}" /etc/passwd
?awk -F: ‘!($3==0){print $1}" /etc/passwd
?awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
此塊乃極為重要,說到底還是正則的熟練運用
~:左邊是否和右邊匹配包含!~:是否不匹配
匹配的內容使用 ”” 或// 框起來
awk–F: "$0 ~ /root/{print $1}‘ /etc/passwd
awk"$0~“^root"" /etc/passwd
awk"$0 !~ /root/‘ /etc/passwd
awk–F: ‘$3==0’ /etc/passwd
應用舉例:
awk -F: "$0 ~ /root/{printf $0"n"}" /etc/passwd
正則表達式的寫法:
awk -F: "$0 ~ /^root/{printf $0"n"}" /etc/passwd
模式匹配與操作符的綜合使用:
awk -F: "$3>=500{printf $0"n"}" /etc/passwd
awk -F: "$3>=500&&$3<=1000{printf "%-25s %-20dn" ,$1,$3}" /etc/passwd
邏輯非時,后面的比較操作符要加()
awk -F: " !($3>=500){printf "%-25s %-20d
" ,$1,$3}" /etc/passwd
selector?if-true-expression:if-false-expression
四:PATTERNawk 格式:
awk option ‘pattern{action}’ file
PATTERN:根據pattern條件,過濾匹配的行,再做處理,不匹配的行不做處理
awk "/^UUID/{print $1}" /etc/fstab
打印以UUID開頭的行的 第一個字段
awk "!/^UUID/{print $1}" /etc/fstab
打印不以 UUID開頭的行的 第一個字段
打印分區利用率
3 relational expression: 關系表達式,結果為“真”才會被處理
真:結果為非0值,非空字符串
假:結果為空字符串或0值
0和沒有內容視作為0值
awk -F: -v n=0 "n++{printf "%-25s %sn",$1,$5}" /etc/passwd
此例子很有意思,因為awk是一行一行處理,所以此次輸出的結果是第一行沒有,后面的行都有輸出
注意:多次使用print打印,中間加;
不顯示/etc/passwd中以/bin/bash結尾的行
1)awk -F: "$NF !="/bin/bash"" /etc/passwd
2)此寫法使用~匹配符號
awk -F: "$NF !~/bash$/" /etc/passwd
startline,endline:/pat1/,/pat2/不支持直接給出數字格式
一找到part1 的就開始打印 匹配到 part2 結束本次循環
再次找part1 開始打印 找到pqrt2結束 .......
eg:
awk "/^r/,/^h/" /etc/passwd
匹配到以r開頭 至以h開頭的行
awk "NR>=10&&NR<=20{print NR,$0}" /etc/passwd
打印第10行到第20行
開頭結尾打印,與其他沒有關系
awk -F: "BEGIN{print "username uid"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}" /etc/passwd
加上表頭
awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}END{print "---------------------------------"}" /etc/passwd
加上列:
awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s |%-10sn", $1,$3}END{print "---------------------------------"}"
常用:action
1)算術運算,比較表達式
2)控制語句,if while for
3) print
常用 控制語句:
1){statement;........}
2) if(條件判斷){命令}
3)if(條件判斷){命令}else {命令}
4)while(條件){命令}
5)for(1,2,3){命令}
6) break continue
1 if else使用舉例格式:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
舉例 /ets/fstab 一行中 字段數多于5個的打印
2 while 循環awk中內置循環,while用于行中的循環處理
舉例:
1)取出每個單詞,并輸出其長度
awk -F: "{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd
2)取出以root開頭行,,并輸出其長度,及每個單詞
awk -F: "/^root/{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd
3)取出以root開頭行,,并輸出每個單詞,單詞長度要大于5個字母
awk -F: "/^root/{i=1;while(i<=NF){if(length($i)>=4)print $i,length($i);i++}}" /etc/passwd
格式:for(1,2,3){4}
特殊用法是:遍歷數組中的元素,后續介紹
4 break, continue的使用break 中斷循環;continue,跳出此次循環,進行下一次循環
七:AWK數組awk使用的數組為關聯數組
awk常常使用for循環來遍歷數組中的元素
舉例:
1 重復的行不打印
awk ‘!arr[$0]++’ f1
此語句中先行運行取反操作,再執行++命令,再去打印,最后再給arr[$0] 加1
2)使用for循環遍歷數組
格式:for(var in arr){action }
var會遍歷arr數組的每一個索引
遍歷 ss –nat連接狀態出現的次數
ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}" arr[$1]++: $1代表第一字段,++代表第一字段相同時加1 for(i in arr):i遍歷數組arr的下標,并把下標的值賦給變量i 另外此塊很重要的另外一部分在于語法書寫的格式,這個在于多寫多練,寫的多了,熟練之后,自然出錯的地方就會越來越少
ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}"
八:函數 1 數值處理rand():返回0和1之間的隨機數,但要配合srand使用
格式: srand()相當于種子,先調用srand() rand()方能生效
eg:
1 :生成0到1之間的隨機數
awk ‘BEGIN{print srand(),rand()}’
2:生成1-100之間的隨機整數
awk "BEGIN{srand();print int(rand()*100)}" int可以定義輸出為整數
3:生成10個1-100之間的隨機整數
awk "BEGIN{srand();for(i=0;i<=10;i++){print int(rand()*100)}}"
1:length([s]):返回指定字符串的長度
2:sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s
eg:字符串中的:用-來進行替代。模式匹配時注意加上//
echo "ac:d:e:f:g"|awk "sub(/:/,"-",$0)"
echo "a:b:c:d:e:f:g"|gawk "sub(/:/,"-",$0)"
3 gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并全部替換為s所表示的內容
全局替換,例子在2中
4 split(s,array,[r]):以r為分隔符,切割字符串s,并將切割后的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2,…
eg:統計netstat –ant 中外部ip地址出現的次數
netstat -ant|awk "/^tcp>/{split($5,arr,":");count[arr[1]]++}END{for(i in count){print i,count[i]}}"
格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}
eg:#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
$awk -f fak.awk
九:awk調用shell中的命令1 使用system命令
2 除了awk中定義的變量,其他全用””括起來
eg:
awk ‘BEGIN{system("hostname") }"
awk"BEGIN{score=100; system("echo your score is " score) }"
awk -F " " "{sum+=$1} END {print sum/NR}" a.txt
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24945.html
閱讀 566·2021-11-18 10:02
閱讀 1048·2021-11-02 14:41
閱讀 674·2021-09-03 10:29
閱讀 1893·2021-08-23 09:42
閱讀 2728·2021-08-12 13:31
閱讀 1199·2019-08-30 15:54
閱讀 1952·2019-08-30 13:09
閱讀 1427·2019-08-30 10:55