AWK

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 的操作
  • awk工作原理
第一步:執行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指定格式符
  • 格式符:與item一一對應
格式符 意義
%c 顯示字符的ASCII碼
%d,%i 顯示十進制整數
%e,%E 顯示科學計數法數值
%f 顯示為浮點數
%g,%G 以科學計數法或浮點形式顯示數值
%s 顯示字符串
%u 無符號整數
%% 顯示%自身
  • 修飾符:
#[.#] :第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
-: 左對齊(默認右對齊) %-15s
+:顯示數值的正負符號 %+d
  • printf示例
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

操作符表達式

  1. 初等表達式包括
    數值與字符串常量, 變量, 字段, 函數調用, 數組元素.
  2. 可以把表達式組合起來的運算符包括
賦值運算符 = += -= *= /= %= ^= 條件表達式 ?:    
邏輯運算符 || (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

正則表達式

  1. 正則表達式的元字符包括:
\ ^ $ . [] | ()  * + ?
  1. 一個基本的正則表達式包括以下幾種:
一個不是元字符的字符,例如A,這個正則表達式匹配的就是它本身;
一個匹配特殊字符的轉義字符:\t匹配一個制表符
一個被引用的元字符,例如\*,按字面意義匹配元字符
^ 匹配一行的開始
$ 匹配一行的結束
. 匹配任意一個字符
一個字符類:[ABC]匹配字符A、B或C
字符類可能包能包含縮寫格式:[A-Za-z]匹配單個字母
一個互補的字符類:[^0-9] 匹配任意一個字符,但除了數字
  1. 運算符組合起來使用
選擇:A|B 匹配A或B
拼接:AB匹配后面緊跟著B的A
閉包:A*匹配0個或多個A
正必包:A+匹配一個或多個A
零或一:A?匹配空字符串或A
括號:被(r)匹配的字符串,與r所匹配的字符串相同
  1. 優先級
選擇運算符 | 優先級最低,然后是拼接運算,最后是重復運算+,*與?;
  1. 轉義序列
序列 意義
\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

  • 常用的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循環
語法:
    while(condition){statement;…}
條件“真”,進入循環;條件“假”, 退出循環
使用場景:
    對一行內的多個字段逐一類似處理時使用
    對數組中的各元素逐一處理時使用
示例:
    awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
  • do-while循環
語法:
    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循環
語法:
    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語句
語法:
    switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}
  • break 和continue
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循環
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腳本

  • 將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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • awk:報告生成器,格式化文本輸出 內容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,467評論 0 9
  • awk介紹awk變量printf命令:實現格式化輸出操作符awk patternawk actionawk數組aw...
    哈嘍別樣閱讀 1,579評論 0 4
  • 本章主要學習內容awk介紹 ?awk基本用法 ?awk變量 ?awk格式化 ?awk操作符 ?awk條件判斷 ?a...
    楠人幫閱讀 1,280評論 0 8
  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,800評論 0 16
  • 轉載 原文的排版和內容都更加友好,并且詳細,我只是在這里貼出了一部分留作自己以后參考和學習,如希望更詳細了解AWK...
    XKirk閱讀 3,241評論 2 25