2018-05-06 GNU awk 2
19198 ワード
1、awk変数内蔵変数FS(field separate):フィールド区切り文字を入力し、デフォルトは空白文字OFS(output field separate):フィールド区切り文字を出力し、デフォルトは空白文字RS(record separate):レコード区切り文字を入力し、デフォルトはリターン改行ORS:レコードの区切り文字を出力し、デフォルトはターンバック改行NF(number field):現在の行に何列のデータがあるか(これは各行で設定された分割子に基づいて再計算され、デフォルトの分割子は任意の連続する複数の空白子である) .
NR(number record):現在処理されている行が何行目であるかを示すレコードの数.行番号の印刷に使用できる.FNR:現在処理されている行は、現在処理されているファイルの何行目のカスタム変数(1)-v var=value(2)プログラムで を直接定義する.
まとめ:awkの変数参照は$ではありません.ここではshellの変数参照とは異なり、awkの文字列に二重引用符を付けなければなりません.そうしないと変数として扱われます.
2、printfコマンド
フォーマット出力:printf「FORMAT」,item 1,item 2,...(1)FORMAT(2)が自動的に改行しないことを指定する必要があり、改行制御子を明示的に与える必要がある.(3)FORMATでは、後のitemごとにフォーマット記号を指定する必要がある.%G:数値%sを科学カウント法または浮動小数点で表示:%s:文字列を表示---最も一般的な%u:符号なし整数%%:%自己修飾子を表示:%3.1 f:3は制御後に印刷する内容の幅を表す;1は小数点以下の精度を表します-:左揃え(デフォルト右揃え)%-15 s、15は幅を定義し、印刷する列が15文字を占めることを示します.-左揃えを定義します+:数値を表示する正負の記号%+d
例
3、算術オペレータ
算術オペレータ:x+y,x-y,x*y,x/y,x^y,x%y-x:負数+xに変換数値付与オペレータ:=,+=,-=,*=,*=,/,%=,^=++,--比較オペレータ:=,!=,>,>=,パターンマッチング:~:左にマッチング右が含まれているかどうか!~:論理オペレータに一致しないかどうか:&&、または、非!例三目式selector?if-true-expression:if-false-expression例
4、awkのpattern
PATTERN:pattern条件に従って、一致する行をフィルタリングし、処理を行う(1)未指定:空モード、一致する各行(2)/regular expression/:一致できる行のみを処理するには、/で囲む必要がある
(3)relational expression:リレーショナル式、結果が「真」である場合にのみ真が処理されます:結果は0以外の値、空でない文字列の偽:結果は空の文字列または0の値
(4)line ranges:行範囲startline,endline:/pat 1/,/pat 2/は直接数値フォーマットを与えることをサポートしていません
(5)BEGIN/ENDモードBEGIN{}:ファイル内のテキストの処理を開始する前に一度だけEND{}:テキスト処理が完了した後に一度だけ実行する例
5、1-10から奇数と偶数を印刷する方法のまとめ
6、awkのaction
一般的なaction分類(1)Expressions:算術,比較式など(2)Control statements:if,whileなど(3)Componentstatements:組合せ文(4)input statements(5)output statements:printなど
7、awk制御文 if-else構文:if(condition){statement;...}else{statement}if(condition 1){statement 1}else if(condition 2){statement 2}else{statement 3}カッコの中に条件判断、カッコの中に実行される動作使用シーン:awkで取得した行全体またはフィールドの条件判断例 while while循环文法:while(condition){statement;...}小かっこの中は条件判断で、大かっこの中はこのような条件の下で実行する动作条件の“真”で、循环に入ります;条件「偽」、ループ使用シーンを終了:1行内の複数のフィールドを1つずつ類似処理するときに配列内の各要素を1つずつ処理するときに使用する例 . 1 1から100の和を計算する方法のまとめ: forループ構文:for(expr 1;expr 2;expr 3){statement;...}一般的な使い方:for(変数初期化;条件判断;変数の修正式){for-body}特殊な使い方:配列内の各要素構文を遍歴できる:for(var in array)例 性能比較
awkの演算速度が最も速いことがわかります breakおよびcontinue、next
まとめ:前の2つはbashの中の使い方と同じで、continueは本輪を飛び出して、breakは全体の循環を飛び出して、nextは早めに本行の処理を終えて直接次の行の処理(awkが自分の行の循環を持っている)に入ります.
8、awk配列
awkの配列は関連配列、すなわちインデックスの下に任意の文字列としてマークされ、数字ではなくインデックスを表す.配列内の各要素を巡回するには、forループfor(var in array)を使用します.varは配列arrayの各インデックスを巡回します.例
9、awk関数
数値処理:rand():0と1の間の乱数を返します.
文字列処理:•length([s]):指定した文字列の長さを返し、括弧の中に文字列がある場合は二重引用符を使用し、変数であれば使用しない•sub(r,s,[t]):t文字列を検索し、rはパターンマッチングの内容を表し、最初のマッチングの内容をsに置き換える
•gsub(r,s,[t]):t文字列を検索し、rはパターンマッチングの内容を表し、すべてsが表す内容に置き換える
•split(s,array,[r]):rを区切り記号として文字列sを切断し、切断後の結果をarrayが表す配列に保存します.最初のインデックス値は1、2番目のインデックス値は2、...
解釈:入力分割子が指定されていないため、デフォルトは空白文字、パターンマッチング、tcpで始まる行にマッチングし、コロンを分割子として5列目をカットし、カットの結果をipという配列に保存し、カットの1列目の値をip[1]というインデックスが1の配列要素に保存し、次に、この配列要素をcount配列のインデックス値として定義すると、ipアドレスごとに出現する回数を表示することができます.男子学生と女子学生の総点数平和級成績 を計算した.カスタム関数フォーマット:function name(parameter,parameter,...){statements return expression}例:
10、awkスクリプト
awkでshellコマンドsystemコマンドを呼び出すスペースはawkの文字列コネクタであり、systemでawkの変数を使用する必要がある場合はスペースで区切るか、awkの変数以外はすべて「」で参照します.
外部ホストssh接続に失敗したipアドレスの数をsshログファイルで見つけるには、接続に失敗した回数が5回以上ある場合は、ファイアウォールに置いてsshでホストを接続することを禁止します.方法1
方法2
awkスクリプト
awkスクリプトへのパラメータの転送
awk '{print NF}' /etc/fstab : , ,
awk '{print $NF}' /etc/fstab :
NR(number record):現在処理されている行が何行目であるかを示すレコードの数.行番号の印刷に使用できる.FNR:現在処理されている行は、現在処理されているファイルの何行目の
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:現在ファイル名ARGC:コマンド行パラメータの個数ARGV:配列であり、コマンド行によって与えられた各パラメータが保存されている[root@centos6 yum.repos.d]#awk 'BEGIN{print ARGC,ARGV[0]}' /etc/fstab /etc/issue ---awk
3 awk
[root@centos6 yum.repos.d]#awk 'BEGIN{print ARGC,ARGV[1]}' /etc/fstab /etc/issue ---/etc/fstab
3 /etc/fstab
[root@centos6 yum.repos.d]#awk 'BEGIN{print ARGC,ARGV[2]}' /etc/fstab /etc/issue ---/etc/issue
3 /etc/issue
[root@centos6 yum.repos.d]#awk -v test="hello gawk" 'BEGIN{print test}'
hello gawk
まとめ:awkの変数参照は$ではありません.ここではshellの変数参照とは異なり、awkの文字列に二重引用符を付けなければなりません.そうしないと変数として扱われます.
2、printfコマンド
フォーマット出力:printf「FORMAT」,item 1,item 2,...(1)FORMAT(2)が自動的に改行しないことを指定する必要があり、改行制御子を明示的に与える必要がある.(3)FORMATでは、後のitemごとにフォーマット記号を指定する必要がある.%G:数値%sを科学カウント法または浮動小数点で表示:%s:文字列を表示---最も一般的な%u:符号なし整数%%:%自己修飾子を表示:%3.1 f:3は制御後に印刷する内容の幅を表す;1は小数点以下の精度を表します-:左揃え(デフォルト右揃え)%-15 s、15は幅を定義し、印刷する列が15文字を占めることを示します.-左揃えを定義します+:数値を表示する正負の記号%+d
例
[root@centos6 yum.repos.d]#cat /etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /app ext4 defaults 0 0
[root@centos6 yum.repos.d]#awk '{printf "%s",$1}' /etc/fstab ---
/dev/sda1/dev/sda2/dev/sda3
[root@centos6 yum.repos.d]#awk '{printf "%s
",$1}' /etc/fstab ---
/dev/sda1
/dev/sda2
/dev/sda3
[root@centos6 yum.repos.d]#awk -F: '{printf "%-10s %-10d
",$1,$3}' /etc/passwd ---
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail
[root@centos6 yum.repos.d]#awk -F: '{printf "username:%s uid:%d
",$1,$3}' /etc/passwd
----pritf , ,
"username:%s $1 ,uid:%d $3
username:root uid:0
username:bin uid:1
username:daemon uid:2
username:adm uid:3
username:lp uid:4
[root@centos6 yum.repos.d]#awk -F: '{printf "username: %-15s uid: %d
",$1,$3}' /etc/passwd
username: root uid: 0
username: bin uid: 1
username: daemon uid: 2
username: adm uid: 3
username: lp uid: 4
3、算術オペレータ
算術オペレータ:x+y,x-y,x*y,x/y,x^y,x%y-x:負数+xに変換数値付与オペレータ:=,+=,-=,*=,*=,/,%=,^=++,--比較オペレータ:=,!=,>,>=,パターンマッチング:~:左にマッチング右が含まれているかどうか!~:論理オペレータに一致しないかどうか:&&、または、非!例
[root@centos6 yum.repos.d]#awk 'BEGIN{print i++}' --- awk i , i=0
0
[root@centos6 yum.repos.d]#awk 'BEGIN{print ++i}' ---
1
[root@centos6 yum.repos.d]#df|awk '$0 ~ /^\/dev\/sd/ {print $1,$5}' ---~
/dev/sda2 3%
/dev/sda1 4%
/dev/sda3 1%
[root@centos6 yum.repos.d]#df |awk '$0~ "^/dev/sd" {print $1,$5}'
/dev/sda2 3%
/dev/sda1 4%
/dev/sda3 1%
[root@centos6 yum.repos.d]#awk -F: '$0 ~ "root"{print $0}' /etc/passwd
--- root,
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@centos6 yum.repos.d]#awk -F: '$0 ~ "^root"' /etc/passwd
--- action, {} ,
[root@centos6 yum.repos.d]#awk '$0 !~ "root"' /etc/passwd
--- root
[root@centos6 yum.repos.d]#awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
--- 0
[root@centos6 yum.repos.d]#awk -F: '$3>=0 && $3<=500{printf "systemuser:%s
",$1}' /etc/passwd ---
systemuser:root
systemuser:bin
systemuser:daemon
systemuser:adm
[root@centos6 yum.repos.d]#awk -F: '$3==0 || $3 >=1000 {print $1}' /etc/passwd ---
root
nfsnobody
[root@centos6 yum.repos.d]#awk -F: '!($3==0){print $1}' /etc/passwd --- , ($3==0)
bin
daemon
adm
lp
[root@centos6 yum.repos.d]#awk -F: '{$3>=500?usertype="common user":usertype="sysuser or rootuser";printf "%s %s
",usertype,$1}' /etc/passwd
[root@centos6 yum.repos.d]#awk -F: '$3>=500?usertype="common user":usertype="sysuser or rootuser"{printf "%s %s
",usertype,$1}' /etc/passwd
, , 。
4、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の値
[root@centos6 yum.repos.d]#awk '!0' /etc/issue
--- 0,
CentOS release 6.9 (Final)
Kernel \r on an \m
[root@centos6 yum.repos.d]#awk '" "' /etc/issue
---
CentOS release 6.9 (Final)
Kernel \r on an \m
[root@centos6 yum.repos.d]#awk '!1' /etc/issue
0
[root@centos6 yum.repos.d]#awk '""' /etc/issue
(4)line ranges:行範囲startline,endline:/pat 1/,/pat 2/は直接数値フォーマットを与えることをサポートしていません
awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd
awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
(5)BEGIN/ENDモードBEGIN{}:ファイル内のテキストの処理を開始する前に一度だけEND{}:テキスト処理が完了した後に一度だけ実行する例
[root@centos6 yum.repos.d]#awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
dufu /bin/bash
[root@centos6 yum.repos.d]#awk -F: '$NF ~ "bash$"{print $1,$NF}' /etc/passwd
root /bin/bash
dufu /bin/bash
[root@centos6 yum.repos.d]#awk -F: 'BEGIN{print "user uid
------------------------------"}{printf "%-15s| %-10d
",$1,$3}END{print "-----------------------
end file"}' /etc/passwd
user uid
------------------------------
root | 0
bin | 1
daemon | 2
adm | 3
lp | 4
sync | 5
shutdown | 6
halt | 7
mail | 8
uucp | 10
operator | 11
games | 12
gopher | 13
ftp | 14
nobody | 99
vcsa | 69
saslauth | 499
postfix | 89
sshd | 74
dufu | 500
ntp | 38
tcpdump | 72
apache | 48
rpc | 32
dbus | 81
rpcuser | 29
nfsnobody | 65534
-----------------------
end file
[root@centos6 yum.repos.d]#seq 10|awk '++i' ---i , 0,0+1=1,
1
2
3
4
5
6
7
8
9
10
[root@centos6 yum.repos.d]#seq 10|awk 'i++' --- i=0,
2
3
4
5
6
7
8
9
10
[root@centos6 yum.repos.d]#seq 10|awk 'i=!i'
1
3
5
7
9
, ,i=0, , ,
,i , , , ,i
, , , ,
[root@centos6 yum.repos.d]#seq 10|awk '!(i=!i)' ---
[root@centos6 yum.repos.d]#seq 10|awk '{i=!i;print i}'
1
0
1
0
1
0
1
0
1
0
5、1-10から奇数と偶数を印刷する方法のまとめ
:echo
[root@centos6 yum.repos.d]#echo {1..10..2}
1 3 5 7 9
[root@centos6 yum.repos.d]#echo {2..10..2}
2 4 6 8 10
:seq
[root@centos6 yum.repos.d]#seq -s " " 1 2 10
[root@centos6 yum.repos.d]#seq -s " " 2 2 10
:sed
[root@centos6 yum.repos.d]#seq 10|sed -n '1~2p'
[root@centos6 yum.repos.d]#seq 10|sed -n '2~2p'
:awk
[root@centos6 yum.repos.d]#seq 10|awk 'i=!i'
[root@centos6 yum.repos.d]#seq 10|awk '!(i=!i)'
6、awkのaction
一般的なaction分類(1)Expressions:算術,比較式など(2)Control statements:if,whileなど(3)Componentstatements:組合せ文(4)input statements(5)output statements:printなど
7、awk制御文
[root@centos6 yum.repos.d]#awk -F: '{if($3>=1000){print $1,$3}}' /etc/passwd
nfsnobody 65534
[root@centos6 yum.repos.d]#awk -F: '{if($NF=="/bin/bash"){print $1,$3}}' /etc/passwd
root 0
dufu 500
[root@centos6 yum.repos.d]#awk '{if(NF>5){print $0}}' /etc/fstab
[root@centos6 yum.repos.d]#awk -F: '{if($3>=500){printf "commonuser:%-15s
",$1}else{printf "systemuser: %-15s
",$1}}' /etc/passwd
systemuser: root
systemuser: bin
systemuser: daemon
systemuser: adm
[root@centos6 yum.repos.d]#awk -F: '{if($3>=500)printf "commonuser:%-15s
",$1;else printf "systemuser: %-15s
",$1}' /etc/passwd ---
[root@centos6 yum.repos.d]#df |awk -F% '/^\/dev\/sd/{print $1}'|awk '$NF>=80{print $1,$5}'
[root@centos6 yum.repos.d]#awk 'BEGIN{test=100;if(test>90){print "very good"}else if(test>60){print "good"}else{print "no pass"}}'
very good
[root@redhat7 script]#echo {1..10}|awk '{i=1;while(i<=NF){ if($i%2==0){print $i,"oushu"}else {print $i,"jishu"};i++}}'
[root@centos6 yum.repos.d]#awk 'BEGIN{print length("xxxxxxx")}'
7
---length(), , ,
, 。
[root@redhat7 rules.d]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-693.el7.x86_64 30
root=UUID=1ef020e7-9a49-4a5d-ae32-fb03caef3f29 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=en_US.UTF-8 16
linux16 7
/vmlinuz-0-rescue-fe8e32bbb81547ccb85916d1fe2a32ff 50
root=UUID=1ef020e7-9a49-4a5d-ae32-fb03caef3f29 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
[root@redhat7 rules.d]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i)};i++}}' /etc/grub2.cfg
/vmlinuz-3.10.0-693.el7.x86_64 30
root=UUID=1ef020e7-9a49-4a5d-ae32-fb03caef3f29 46
crashkernel=auto 16
LANG=en_US.UTF-8 16
/vmlinuz-0-rescue-fe8e32bbb81547ccb85916d1fe2a32ff 50
root=UUID=1ef020e7-9a49-4a5d-ae32-fb03caef3f29 46
crashkernel=auto 16
[root@centos7 ~]#cat f1.txt
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
[root@centos7 ~]#awk '{i=1;sum=0;while(i<=NF){sum+=i;i++};print sum,i}' f1.txt
55 11
66 12
[root@centos7 ~]#awk '{i=1;sum=0;while(i<=NF){sum+=$i;i++};print sum,i}' f1.txt --- , sum ,
sum 0, 0
55 11
165 12
[root@centos7 ~]#awk '{i=1;while(i<=NF){sum+=$i;i++}}END{print sum}' f1.txt ---END , sum , 0,
,sum ,
220
[root@centos7 ~]#awk '{i=1;while(i<=NF){sum+=$i;i++};print sum,i}END{print sum}' f1.txt --- , sum
, 。
55 11
220 12
220
[root@redhat7 system]#echo {1..100}|tr ' ' '+'|bc
5050
[root@redhat7 system]#seq -s "+" 100|bc
5050
[root@redhat7 system]#sum=0;for i in {1..100};do let sum+=i;done;echo $sum
5050
[root@redhat7 script]#i=1,sum=0;while [ $i -le 100 ];do let sum+=i;let i++;done;echo $sum
5050
[root@redhat7 script]#for((i=1,sum=0;i<=100;i++));do let sum+=i;done;echo $sum
5050
[root@redhat7 script]#awk 'BEGIN{sum=0;i=1;while(i<=100){sum+=i;i++};print sum}'
5050
[root@redhat7 script]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg
[root@redhat7 script]#time (awk 'BEGIN{for(i=1;i<=100000;i++){sum+=i};print sum}')
5000050000
real 0m0.012s
user 0m0.010s
sys 0m0.002s
[root@redhat7 script]#time (sum=0;for i in {1..100000};do let sum+=i;done;echo $sum)
5000050000
real 0m0.521s
user 0m0.099s
sys 0m0.422s
[root@redhat7 script]#time (seq -s "+" 100000|bc)
5000050000
real 0m0.039s
user 0m0.040s
sys 0m0.003s
awkの演算速度が最も速いことがわかります
[root@redhat7 script]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i};print sum}'
2500
[root@redhat7 script]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'
2145
[root@redhat7 script]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)continue;sum+=i}print sum}'
4984
[root@redhat7 script]#awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
systemd-network 192
sshd 74
zhang 1000
apache 48
まとめ:前の2つはbashの中の使い方と同じで、continueは本輪を飛び出して、breakは全体の循環を飛び出して、nextは早めに本行の処理を終えて直接次の行の処理(awkが自分の行の循環を持っている)に入ります.
8、awk配列
awkの配列は関連配列、すなわちインデックスの下に任意の文字列としてマークされ、数字ではなくインデックスを表す.配列内の各要素を巡回するには、forループfor(var in array)を使用します.varは配列arrayの各インデックスを巡回します.例
[root@redhat7 app]#awk -F: '{line[$7]++}END{for(i in line){print i,line[i]}}' /etc/passwd
/bin/sync 1
/bin/bash 3
/sbin/nologin 16
/sbin/halt 1
/sbin/shutdown 1
line , ,
line 1,i line , i
,line , , 0,
, 1, ,line[i]
, , line 1。
[root@redhat7 app]#netstat -nat|awk '/^tcp/{state[$NF]++}END{for(i in state){print i,state[i]}} '
LISTEN 5
ESTABLISHED 2
[root@redhat7 app]#cat f1
aaaaa
ddddd
ccccc
aaaaa
bbbbb
ccccc
ddddd
bbbbb
[root@redhat7 app]#awk '!line[$0]++' f1
aaaaa
ddddd
ccccc
bbbbb
, , sort uniq 。
: line , line
0, ,
,line 0, , ,
, 1, 1, action,
, 。line 1, 。
,line 1, 2, , line
0, , , ,
。
:! ++ , , ++
[root@redhat7 app]#netstat -nt|awk -F "[[:space:]:]+" '/^tcp/{ip[$6]++}END{for(i in ip){print i,ip[i]}}'|sort -k2 -nr|head -n 10
-F "[[:space:]:]+" , awk ip
9、awk関数
数値処理:rand():0と1の間の乱数を返します.
[root@redhat7 app]#awk 'BEGIN{print rand()}'
0.237788
[root@redhat7 app]#awk 'BEGIN{print rand()}'
0.237788
[root@redhat7 app]#awk 'BEGIN{print rand()}'
0.237788
[root@redhat7 app]#awk 'BEGIN{srand();print rand()}'
0.0522516 --- srand() , 0-1
, , ,
[root@redhat7 app]#awk 'BEGIN{srand();print rand()*100}'
26.8591 --- 100
[root@redhat7 app]#awk 'BEGIN{srand();print int(rand()*100)}'
[root@redhat7 app]#awk 'BEGIN{srand();for (i=1;i<=10;i++){print int(rand()*100)}}' -- 10
22 --- int
文字列処理:•length([s]):指定した文字列の長さを返し、括弧の中に文字列がある場合は二重引用符を使用し、変数であれば使用しない•sub(r,s,[t]):t文字列を検索し、rはパターンマッチングの内容を表し、最初のマッチングの内容をsに置き換える
[root@redhat7 app]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)' --- , , , -
2008-08:08 08:08:08
•gsub(r,s,[t]):t文字列を検索し、rはパターンマッチングの内容を表し、すべてsが表す内容に置き換える
[root@redhat7 app]#echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'
2008-08-08 08-08-08
•split(s,array,[r]):rを区切り記号として文字列sを切断し、切断後の結果をarrayが表す配列に保存します.最初のインデックス値は1、2番目のインデックス値は2、...
[root@redhat7 app]#netstat -nt|awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
解釈:入力分割子が指定されていないため、デフォルトは空白文字、パターンマッチング、tcpで始まる行にマッチングし、コロンを分割子として5列目をカットし、カットの結果をipという配列に保存し、カットの1列目の値をip[1]というインデックスが1の配列要素に保存し、次に、この配列要素をcount配列のインデックス値として定義すると、ipアドレスごとに出現する回数を表示することができます.
[root@redhat7 app]#cat f1
mage 100 male
wang 90 male
zhang 80 female
li 100 female
[root@redhat7 app]#awk '{total[$3]+=$2;num[$3]++}END{for(name in total){print name,total[name],total[name]/num[name]}}' f1
[root@redhat7 app]#awk '{if($3 == "male"){msum+=$2;mnum++}else{fsum+=$2;fnum++}}END{printf "msum=%d mavg=%.2f
fsum=%d favg=%.2f
",msum,msum/mnum,fsum,fsum/fnum}' f1
#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
10、awkスクリプト
awkでshellコマンドsystemコマンドを呼び出すスペースはawkの文字列コネクタであり、systemでawkの変数を使用する必要がある場合はスペースで区切るか、awkの変数以外はすべて「」で参照します.
awk BEGIN'{system("hostname") }'
awk'BEGIN{score=100; system("echo your score is " score) }'
外部ホストssh接続に失敗したipアドレスの数をsshログファイルで見つけるには、接続に失敗した回数が5回以上ある場合は、ファイアウォールに置いてsshでホストを接続することを禁止します.方法1
[root@centos6 app]#vim awk.sh
1 #!/bin/bash
2 #
3 while true;do
4 cat /var/log/secure|awk '/Failed/{ip[$(NF-3)]++}END{for(i in ip){if(ip[i]>=5){system("iptables -A INPUT -s "i" -j REJECT")}}}'
5 sleep 5
6 done
方法2
[root@centos6 app]#cat jianchassh.sh
#!/bin/bash
#
while true;do
cat /var/log/secure |grep "Failed"|awk '{ip[$(NF-3)]++}END{for(i in ip){print i,ip[i]}}'> /app/f6
cat /app/f6 |while read file;do
ip=`echo $file|cut -d ' ' -f1`
num=`echo $file|cut -d ' ' -f2`
if [ $num -ge 5 ];then
iptables -A INPUT -s $ip -j REJECT
fi
done
sleep 2m
done
awkスクリプト
#cat f1.awk
{if($3>=1000)print $1,$3}
#awk -F: -f f1.awk /etc/passwd
#cat f2.awk
#!/bin/awk –f -- awk
#this is a awkscript
{if($3>=1000)print $1,$3}
#chmod +x f2.awk
#f2.awk –F: /etc/passwd
awkスクリプトへのパラメータの転送
#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