awk介紹
- awk :Aho, Weinberger, Kernighan,報告生成器,格式化文本輸出
- 有多種版本:New awk(nawk),GNU awk(gawk)
- gawk :模式掃描和處理語言
- 基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk 程序通常由:BEGIN 語句 塊、能夠使用模式匹配的通用語句塊END語句塊,共3部分組成
program通常是被單引號或雙引號中
選項:
-F:指明輸入時用到的字段分隔符
-v var=value:自定義變量
awk語言
- 基本格式:awk [options] 'program' file…
- program:pattern{action statements;..}
- pattern 和action: :
pattern 部分決定動作語句何時觸發及觸發事件
BEGIN,END
action statements 對數據進行處理,放在{} 內指明
print, printf
awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱為域標識。$0 為所有域,注意:和shell 中變量$ 符含義不同
文件的每一行稱為記錄
省略action行,則默認執行print $0 的操作
第一步:執行BEGIN{action;… } 語句塊中的語句
第二步:從文件或標準輸入(stdin) 讀取一行,然后執行pattern{ action;… } 語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
第三步:當讀至輸入流末尾時,執 END{action;…} 語句塊
BEGIN語句塊在awk 開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN 語句塊中
END語句塊在awk 從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END 語句塊中完成,它也是一個可選語句塊
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊
awk
print 格式:print item1, item2, ...
要點:
(1)逗號分隔符
(2)輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式
(3)如省略item ,相當于print $0
示例:
awk '{print "hello,awk"}'
awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd
tail –3 /etc/fstab |awk ‘{print $2,$4}’
awk變量
模式 |
例子 |
匹配 |
BEGIN |
BEGIN |
輸入被讀取之前 |
END |
END |
所有輸入被讀取之后 |
expression |
$3>100 |
第三個字段大于100 |
string-matching |
/Asia/ |
含有Asia的行 |
compound |
$3<100 && $4 =="Asia" |
第三個字段小于100且第四個字段含有Asia的行 |
range |
NR == 10,NR==20 |
輸入的第10行到20行 |
變量 |
意義 |
默認值 |
FS |
控制這輸入行的字段分隔符 |
" " |
OFS |
輸出字段分隔符 |
" " |
RS |
控制著輸入行的記錄分隔符 |
"\n" |
ORS |
輸出記錄的分隔符 |
"\n" |
NF |
當前記錄的字段個數 |
- |
NR |
到目前為止讀的記錄數量 |
- |
FNR |
當前輸入文件的記錄個數 |
- |
ARGC |
命令行參數的個數 |
- |
ARGV |
命令行參數數組 |
- |
FILENAME |
當前輸入文件名 |
- |
OFMT |
數值的輸出格式 |
"%.6g" |
RLENGTE |
被函數match匹配的字符串的長度 |
- |
RSTART |
被函數match匹配的字符串的開始 |
SUBSEP |
下標分隔符 |
"\034" |
FS:輸入字段分隔符,默認為空白字符
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd
s=:;awk -v FS=$s '{print $1 FS $3}' /etc/passwd
OFS:輸出字段分隔符,默認為空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段數量
awk -F:‘{print NF}’ /etc/fstab, 引用內置變量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
NR:行號
awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab
FNR:各文件分別計數, 行號
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:當前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行參數的個數
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:數組,保存的是命令行所給定的各參數
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
自定義變量(區分字符大小寫)
(1) -v var=value
(2) 在program中直接定義
示例:
awk -v test='hello gawk' '{print test}' /etc/fstab
awk -v test='hello gawk' 'BEGIN{print test}'
awk 'BEGIN{test="hello,gawk";print test}'
awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd
cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
printf命令
- 格式化輸出:printf “FORMAT ”, item1, item2, ...
(1)必須指定FORMAT
(2)不會自動換行,需要顯式給出換行控制符,\n
(3)FORMAT中需要分別為后面每個item指定格式符
格式符 |
意義 |
%c |
顯示字符的ASCII碼 |
%d,%i |
顯示十進制整數 |
%e,%E |
顯示科學計數法數值 |
%f |
顯示為浮點數 |
%g,%G |
以科學計數法或浮點形式顯示數值 |
%s |
顯示字符串 |
%u |
無符號整數 |
%% |
顯示%自身 |
#[.#] :第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
-: 左對齊(默認右對齊) %-15s
+:顯示數值的正負符號 %+d
awk -F: ‘{printf "%s",$1}’ /etc/passwd
awk -F: ‘{printf "%s\n",$1}’ /etc/passwd
awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: ‘{printf "Username: %s\n",$1}’ /etc/passwd
awk -F: ‘{printf “Username: %s,UID:%d\n",$1,$3}’ /etc/passwd
awk -F: ‘{printf "Username: %15s,UID:%d\n",$1,$3}’ /etc/passwd
awk -F: ‘{printf "Username: %-15s,UID:%d\n",$1,$3}’ /etc/passwd
操作符表達式
- 初等表達式包括
數值與字符串常量, 變量, 字段, 函數調用, 數組元素.
- 可以把表達式組合起來的運算符包括
賦值運算符 = += -= *= /= %= ^= 條件表達式 ?:
邏輯運算符 || (OR), && (AND), ! (NOT)
匹配運算符 ~ 和 !~
關系運算符 < <= == != > >=
拼接運算符 (沒有顯式的拼接運算符)
算術運算符 + - * / % ^
單目運算符 +和-
自增與自減運算符 ++ 和 -- (包括前綴與后綴)
括號 (用于分組)
操作 |
運算符 |
例子 |
例子的含義 |
賦值 |
= += -= *= /= %= ^= |
x *= 2 |
x = x * 2 |
條件表達式 |
?: |
x ? y : z |
若 x 為真, 則 y, 否則 z |
邏輯與 |
&& |
x && y |
若 x 與 y 都為真, 則為 1, 否則為 0 |
數組成員 |
in |
i in a |
如果 a[i] 存在, 則為 1, 否則為 0 |
匹配 |
~ !~ |
$1 ~ /x/ |
如果第一個字段包含 x, 則為 1, 否則為 0 |
關系運算 |
< <= == != >= > |
x == y |
如果 x 等于 y, 則為 1, 否則為 0 |
拼接 |
|
"a" "bc" |
"abc"; 不存在顯式的拼接運算符 |
減法, 加法 |
+ - |
x + y |
x 與 y 的和 |
乘法, 除法, 取模 |
* / % |
x % y |
x 除以 y 的余數 |
單目加, 單目減 |
+ - |
-x |
x 的相反數 |
邏輯非 |
! |
!$1 |
若 $1 為空或為 0, 則為 1, 否則為 0 |
指數運算 |
^ |
x ^ y |
x的y次方 |
自增, 自減 |
++ -- |
++x, x++ |
為 x 加 1 |
字段 |
$ |
$i+1 |
1 加上第 i 個字段的值 |
組 |
( ) |
($i)++ |
給第 i 個字段的值加 1 |
x+y, x-y, x*y, x/y, x^y, x%y
-x:轉換為負數
+x:轉換為數值
- 字符串操作符:沒有符號的操作符,字符串連接
- 賦值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
==, !=, >, >=, <, <=
~:左邊是否和右邊匹配包含
!~ :是否不匹配
示例:
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: '$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: '$3 > 100 && $3<1000 {print $1,$3}' passwd
- 函數調用: function_name(argu1, argu2, ...)
- 條件表達式(三目表達式):
selector?if-true-expression:if-false-expression
示例:
awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
awk -F: '{$3>1000?username="common user:":username="sysuser:";printf "%s %-30s %d\n",username,$1,$3}' passwd
正則表達式
- 正則表達式的元字符包括:
\ ^ $ . [] | () * + ?
- 一個基本的正則表達式包括以下幾種:
一個不是元字符的字符,例如A,這個正則表達式匹配的就是它本身;
一個匹配特殊字符的轉義字符:\t匹配一個制表符
一個被引用的元字符,例如\*,按字面意義匹配元字符
^ 匹配一行的開始
$ 匹配一行的結束
. 匹配任意一個字符
一個字符類:[ABC]匹配字符A、B或C
字符類可能包能包含縮寫格式:[A-Za-z]匹配單個字母
一個互補的字符類:[^0-9] 匹配任意一個字符,但除了數字
- 運算符組合起來使用
選擇:A|B 匹配A或B
拼接:AB匹配后面緊跟著B的A
閉包:A*匹配0個或多個A
正必包:A+匹配一個或多個A
零或一:A?匹配空字符串或A
括號:被(r)匹配的字符串,與r所匹配的字符串相同
- 優先級
選擇運算符 | 優先級最低,然后是拼接運算,最后是重復運算+,*與?;
- 轉義序列
序列 |
意義 |
\b |
退格 |
\f |
換頁 |
\n |
換行 |
\r |
回車 |
t |
制表符 |
\ddd |
八進制數ddd.ddd含有1到3個數字,每個數字的值在0-7之間 |
\c |
其他字面意義上的c(如\表示,"表示雙引號) |
^[^^] 匹配不以脫字符開始的字符串
/^[0-9]+$/ 匹配含有且只含有數字的輸入行
/^[0-9][0-9][0-9]$/ 輸入行有且僅有 3 個數字.
/^(\+|-)?[0-9]+\.?[0-9]*$/ 十進制小數, 符號與小數部分是可選的.
/^[+-]?[0-9]+[.]?[0-9]*$/ 也是匹配十進制小數, 帶有可選的符號與小數部分.
/^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$/ 浮點數, 符號與指數部分是可選的.
/^[A-Za-z][A-Za-z0-9]*$/ 一個字母, 后面再跟著任意多個字母或數字 (比如awk的變量名).
/^[A-Za-z]$|^[A-Za-z][0-9]$/ 一個字母, 又或者是一個后面跟著一個數字的字母 (比如 Basic 的變量名).
/^[A-Za-z][0-9]?$/ 同樣是一個字母, 又或者是一個后面跟著一個數字的字母
awk PATTERN
- PATTERN: 根據pattern 條件,過濾匹配的行,再做處理
(1) 如果未指定:空模式,匹配每一行
(2) /regular expression/ :僅處理能夠模式匹配到的行,需要用/ / 括起來
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
(3) relational expression: 關系表達式,結果為“真”才會被處理
真:結果為非0 值,非空字符串
假:結果為空字符串或0值 值
示例:
awk -F: 'i=1;j=1{print i,j}' /etc/passwd
awk ‘!0’ /etc/passwd ; awk ‘!1’ /etc/passwd
awk –F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
(4) line ranges:行范圍
startline,endline
/pat1/,/pat2/
awk -F: ‘/^root\>/,/^nobody\>/{print $1}' /etc/passwd
注意:不支持直接給出數字格式
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
(5) BEGIN/END 模式
BEGIN{}: 僅在開始處理文件中的文本之前執行一次
END{} :僅在文本處理完成之后執行一次
示例
awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd
awk -F : '{print "USER USERID“;print $1":"$3} END{print "end file"}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n--------------- "}{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print " USER UID \n--------------- "}{print $1,$3}'END{print "=============="} /etc/passwd
seq 10 |awk ‘i=0’
seq 10 |awk ‘i=1’
seq 10 | awk 'i=!i‘
seq 10 | awk '{i=!i;print i}‘
seq 10 | awk ‘!(i=!i)’
seq 10 |awk -v i=1 'i=!i'
模式總結
模式|例子|匹配
-- | --| --
BEGIN|BEGIN|輸入被讀取之前
END|END|所有輸入被讀取之后
expression|$3>100|第三個字段大于100
string-matching|/Asia/|含有Asia的行
compound|$3<100 && $4 =="Asia"|第三個字段小于100且第四個字段含有Asia的行
range|NR == 10,NR==20|輸入的第10行到20行
awk action
(1) Expressions: 算術,比較表達式等
(2) Control statements:if,while等
(3) Compound statements:組合語句
(4) input statements
(5) output statements :print等
awk 控制語句
{ statements;… } 組合語句
if(condition) {statements;…}
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
next 開始輸入主循環的下一次迭代
delete array[index]
delete array
exit
exit expression 馬上執行END 動作; 如果已經在END動作內, 那就退出程序. 將 expression 作為程序的退出狀態返回.
awk控制語句
if-else
語法:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
使用場景:對awk取得的整行或某個字段做條件判斷
示例:
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
awk '{if(NF>5) print $0}' /etc/fstab
awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
awk -F: '{if($3>=1000) printf "Common user: %s\n",$1;
else printf "root or Sysuser: %s\n",$1}' /etc/passwd
df -h|awk -F% '/^\/dev/{print $1}'|awk '$NF>=80{print $1,$5}‘
awk 'BEGIN{ test=100;if(test>90){print "very good"}
else if(test>60){ print "good"}else{print "no pass"}}'
awk控制語句
語法:
while(condition){statement;…}
條件“真”,進入循環;條件“假”, 退出循環
使用場景:
對一行內的多個字段逐一類似處理時使用
對數組中的各元素逐一處理時使用
示例:
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
語法:
do {statement;…}while(condition)
意義:無論真假,至少執行一次循環體
示例:
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}‘
思考:下面兩語句有何不同?
awk ‘BEGIN{i=0;print ++i,i}’
awk ‘BEGIN{i=0;print i++,i}’
語法:
for(expr1;expr2;expr3) {statement;…}
常見用法:
for(variable assignment;condition;iteration process)
{for-body}
特殊用法:能夠遍歷數組中的元素
語法:for(var in array) {for-body}
示例:
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
在下面這個程序里, for 的循環體是一個空語句.
BEGIN { FS = "\t" }
{ for (i = 1; i <= NF && $i != ""; i++)
;
if (i <= NF)
print
}
這個程序打印所有的, 包含空字段的行.
性能比較
- time (awk 'BEGIN{
total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
- time(total=0;for i in {1..10000};do
total=$(($total+i));done;echo $total)
- time(for ((i=0;i<=10000;i++));do let total+=i;done;echo
$total)
- time(seq –s ”+” 10000|bc)
awk控制語句
語法:
switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0)continue;sum+=i}print sum}‘
awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==66)break;sum+=i}print sum}‘
- break [n]
- continue [n]
- next:
提前結束對本行處理而直接進入下一行處理(awk自身循環)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
awk 數組
- 關聯數組:array[index-expression]
index-expression:
(1)可使用任意字符串;字符串要使用雙引號括起來
(2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”
若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
示例:
weekdays[“mon”]="Monday“
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}''
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="tuesday";for(i in weekdays) print weekdays[i]}'
awk ‘!arr[$0]++’ dupfile 重復的行只顯示一次
awk '{!arr[$0]++;print $0, arr[$0]}' dupfile
for(var in array) {for-body}
注意:var會遍歷array的每個索引
示例:
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"] ="Tuesday";for(i in weekdays) {print weekdays[i]}}‘
netstat -tan | awk '/^tcp/{state[$NF]++}END {for(i in state) { print i,state[i]}}'
awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
awk函數
rand():返回0和1之間一個隨機數
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
內建算術函數
函數 |
返回值 |
atan2(y,x) |
y/x的反正切值, 定義域在 ?π 到π之間 |
cos(x) |
x的余弦值, x以弧度為單位 |
exp(x) |
x的指數函數,e x |
int(x) |
x的整數部分; 當x大于0時, 向 0取整 |
log(x) |
x的自然對數(以e為底) |
rand() |
返回一個隨機數r, 0 ≤ r < 1 |
sin(x) |
x的正弦值, x以弧度為單位. |
sqrt(x) |
x的方根 |
srand(x) |
x是rand() 的新的隨機數種子 |
length([s]):返回指定字符串的長度
sub(r,s,[t]):對t字符串進行搜索r 表示的模式匹配的內容,并將第一個匹配的內容替換為s
echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)'
gsub(r,s,[t]):對t字符串進行搜索r 表示的模式匹配的內容,并全部替換為s所表示的內容
echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)'
split(s,array,[r]) :以r 為分隔符,切割字符串s,并將切割后的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2,…
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}'
內建字符串函數
函數 |
描述 |
gsub(r,s) |
將$0中所有出現的r替換為 s,返回替換發生的次數. |
gsub(r,s,t ) |
將字符串t中所有出現的r替換為s,返回替換發生的次數 |
index(s,t) |
返回字符串t在s中第一次出現的位置, 如果t沒有出現的話, 返回 0. |
length(s) |
返回 s 包含的字符個數 |
match(s,r) |
測試 s 是否包含能被 r 匹配的子串, 返回子串的起始位置或0; 設置RSTART與RLENGTH |
split(s,a) |
用FS將 s 分割到數組 a 中, 返回字段的個數 |
split(s,a,fs) |
用fs分割 s 到數組 a 中, 返回字段的個數 |
sprintf(fmt,expr-list) |
根據格式字符串 fmt 返回格式化后的expr-list |
sub(r,s) |
將 $0 的最左最長的, 能被 r 匹配的子字符串替換為s,返回替換發生的次數. |
sub(r,s,t) |
把 t 的最左最長的, 能被 r 匹配的子字符串替換為 s,返回替換發生的次數. |
substr(s,p) |
返回 s 中從位置 p 開始的后綴. |
substr(s,p,n) |
返回 s 中從位置 p 開始的, 長度為 n 的子字符串. |
格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}
示例:
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 fun.awk
awk中調用shell命令
- system命令
- 空格是awk中的字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用""引用起來。
awk BEGIN'{system("hostname") }'
awk 'BEGIN{score=100; system("echo your score is " score) }'
awk腳本
cat f1.awk
{if($3>=1000)print $1,$3}
awk -F: -f f1.awk /etc/passwd
cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
chmod +x f2.awk
f2.awk –F: /etc/passwd
向awk腳本傳遞參數
格式:
awkfile var=value var2=value2... Inputfile
注意:在BEGIN 過程 中不可用。直到首行輸入完成以后 ,變量才可用 。可以通過-v參數,讓awk 在執行BEGIN之前得到變量的值。命令行中每一個指定的變量都需要一個-v參數
示例:
cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
chmod +x test.awk
test.awk -F: min=100 max=200 /etc/passwd
1、統計/etc/fstab 文件中每個文件系統類型出現的次數
2、統計/etc/fstab 文件中每個單詞出現的次數
3、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有數字
4、解決DOS攻擊生產案例:根據web 日志或者或者網絡連接數,監控當某個IP并發連接數或者短時內PV 達到100,即調用防火墻命令封掉對應的IP ,監控頻率每隔5 分鐘。防火墻命令為:iptables -A INPUT -s IP -j REJECT