awk
时间:2010-05-26 来源:gamester88
# awk '{if($4~/Brown/) print $0}' test
打印test文件裏第四列包含Brown的行
# awk '$0 ~ /Brown/' test
打印test文件裏包含Brown的行
#awk '/Brown/' test
打印test文件裏包含Brown的行
#awk '{if($3~/48/) print$0}' test
打印test文件裏第三列包含48的行
# awk '$3=="48" {print$0}' test
#awk '{if($3=="48") print$0}' test
打印test文件裏第三列等于48的行
# awk '$0 !~ /Brown/' test
打印test文件裏不包含Brown的行
# awk '{if($4!~/Brown/) print $0}' test
打印test文件裏第四列不包含Brown的行
# awk '$4!="Brown-2"' test
打印test文件裏第四列不等于Brown-2的行
# awk '{if($6 < $7) print $0}' test
打印第六列小于第七列的行
# awk '{if($6 <= $7) print $1}' test
打印第六列小于等于第七列的行然後輸入第一列
# awk '{if($6 > $7) print $1}' test
打印第六列大于第七列的行然後輸入第一列
# awk '/[Gg]reen/' test
打印包含Green或green的行
# awk '$1 ~ /^...a/' test
打印第一列第四個字符為a的行
# awk '$0 ~/(Yellow|Brown)/' test
打印test文件裏包含Yellow或者Brown的行
# awk '/^M/' test
打印以M開頭的行
# awk '{if ($1=="P.Bunny" && $4=="Yellow") print $0}' test
打印第一列匹配P.Bunny和第四列匹配Yellow的行
#awk '{if ($4=="Yellow" || $4~/Brown/) print $0}' test
打印第四列等于Yellow或者第四列包含Brown的行
# awk 'END{print NR}' test
打印test文件的行數
# awk '{print NF,NR,$0} END{print FILENAME}' test
7 1 M.Tans 5/99 48311 Green 8 40 44
7 2 J.Lulu 06/99 48317 green 9 24 26
7 3 P.Bunny 02/99 48 Yellow 12 35 28
7 4 J.Troll 07/99 4842 Brown-3 12 26 26
7 5 L.Tansl 05/99 4712 Brown-2 12 30 28
test
打印此行幾列此為第幾行最後輸出文件名
# awk '{if (NR>0 && $4~/Brown/)print $0}' test
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
# pwd
/home/gamester88/testlog
# echo $PWD | awk -F/ '{print $NF}'
testlog
# awk '{name=$1;belts=$4;if(belts ~/Yellow/) print name " is belt "belts}' test
P.Bunny is belt Yellow
# $ awk '{if ($6<$7) print $0}' test
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
#awk 'BEGIN{BASELINE="27"} {if ($6<BASELINE) print $0}'
J.Lulu 06/99 48317 green 9 24 26
J.Troll 07/99 4842 Brown-3 12 26 26
# awk '{if($1=="M.Tans") {$6=$6-1};print $1,$6,$7}' test
M.Tans 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansl 30 28
# awk '{if($1=="M.Tans"){$6=$6-1;print $1,$6,$7}}' test
M.Tans 39 44
# awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' test
M.Tans
J.Lulu
P.Bunny
J.L.Troll
L.Tansl
# awk '{if($1=="J.Troll") {$1="J.L.Troll"; print $1}}' test
J.L.Troll
# awk 'BEGIN {print "Name\tDifference"}{if($6<$7){$8=$7-$6;print $1,$8}}' test
Name Difference
M.Tans 4
J.Lulu 2
# awk 'BEGIN {print "Name\tDifference"}{if($6<$7){diff=$7-$6;print $1,diff}}' test
Name Difference
M.Tans 4
J.Lulu 2
# awk '(tot+=$6);END{print "Club student total points :" tot}' test
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
Club student total points :155
#awk '{(tot+=$6)};END{print "Club student total points :" tot}' test
Club student total points :155
# ls -l | awk '/^[^d]/ {print $8"\t"$5} {tot+=$5} END {print "total KB:" tot}'
igowei.log 45
igowei.sh 509
test 172
tuoguan.sh 516
xian.sh 502
total KB:14032
# awk 'gsub(/4842/,4899){print $0}' test
J.Troll 07/99 4899 Brown-3 12 26 26
# awk 'gsub(/4842/,4899)' test
J.Troll 07/99 4899 Brown-3 12 26 26
把4842替換為4899
# awk 'BEGIN {print index("Bunny","ny")}' test
4
查詢ny字符串在Bunny的開始位置
# awk '$1=="M.Tans" {print length($1)" "$1}' test
6 M.Tans
M.Tans長度為6
# awk 'BEGIN{print length("A FEW GOOD MEN")}'
14
A FEW GOOD MEN長度為14
# awk 'BEGIN{print match("ANCD",/d/)}'
0
# awk 'BEGIN{print match("ANCD",/D/)}'
4
# awk '$1=="J.Lulu" {print match($1,"u")}' test
4
# awk 'BEGIN {print split("123-456-789",pats_array,"-")}'
3
# awk 'BEGIN {print split("123#456#789",myarray,"#")}'
3
# awk 'BEGIN {split("123#456#789",myarray,"#");print myarray[1]}'
123
# awk 'BEGIN {split("123#456#789",myarray,"#");print myarray[2]}'
456
substr操作
# awk '$1=="L.Tansl" {print substr($1,1,5)}' test
L.Tan
輸出$1的第一到第五字符
# awk '{print substr($1,3)}' test
Tans
Lulu
Bunny
Troll
Tansl
輸出$1,從第三個字符開始
#g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,然而,如果未指定目标,缺省为$ 0。
#i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符长度。
#m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将字符串s划分为指定序列a。
#s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的结果字符串e x p。
#s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被( r)匹配。
#s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。
# \ b 退格键
# \ t t a b键
# \ f 走纸换页
# \ d d d 八进制值
# \ n 新行
# \ c 任意其他特殊字符,例如\ \为反斜线符号
# \ r 回车键
printf参数printf([格式控制符],参数)
- 左对齐
Wi d t h 域的步长,用0表示0步长
. p r e c 最大字符串长度,或小数点右边的位数
% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如(1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换e或者f
% o 八进制数
% s 字符串
% x 十六进制数
awk内置变量
A R G C 命令行参数个数
A R G V 命令行参数排列
E N V I R O N 支持队列中系统环境变量的使用
FILENAME a w k浏览的文件名
F N R 浏览文件的记录数
F S 设置输入域分隔符,等价于命令行- F选项
N F 浏览记录的域个数
N R 已读的记录数
O F S 输出域分隔符
O R S 输出记录分隔符
R S 控制记录分隔符
A R G C支持命令行中传入a w k脚本的参数个数。A R G V是A R G C的参数排列数组,其中每一元素表示为A R G V [ n ],n为期望访问的命令行参数。
E N V I R O N 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如E N V I R O N [“E D I TO R”] =“Vi”。
F I L E N A M E支持a w k脚本实际操作的输入文件。因为a w k可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。
F N R支持a w k目前操作的记录数。其变量值小于等于N R。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。
F S用来在a w k中设置域分隔符,与命令行中- F选项功能相同。缺省情况下为空格。如果用逗号来作域分隔符,设置F S = ","。
N F支持记录域个数,在记录被读之后再设置。
O F S允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
O R S为输出记录分隔符,缺省为新行( \ n)。
R S是记录分隔符,缺省为新行( \ n )。
###############################grep选项##############################################
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
此模式有三种形式,即:
pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数.
#awk 'NR==FNR{a[$3]++;next}a[$3]==1' file file
$3重复的不显示
#awk 'NR==FNR{a[$1]=$2;next}{$2=$2-a[$1]}2' file1 file2
file2的$2减file1的$2
#echo "<xml>abc.whatever<a><sss>xxxcvvv<bbb></xml>"|grep -Eo "[^>]*\.[^<]*"
提前abc.whatever
打印test文件裏第四列包含Brown的行
# awk '$0 ~ /Brown/' test
打印test文件裏包含Brown的行
#awk '/Brown/' test
打印test文件裏包含Brown的行
#awk '{if($3~/48/) print$0}' test
打印test文件裏第三列包含48的行
# awk '$3=="48" {print$0}' test
#awk '{if($3=="48") print$0}' test
打印test文件裏第三列等于48的行
# awk '$0 !~ /Brown/' test
打印test文件裏不包含Brown的行
# awk '{if($4!~/Brown/) print $0}' test
打印test文件裏第四列不包含Brown的行
# awk '$4!="Brown-2"' test
打印test文件裏第四列不等于Brown-2的行
# awk '{if($6 < $7) print $0}' test
打印第六列小于第七列的行
# awk '{if($6 <= $7) print $1}' test
打印第六列小于等于第七列的行然後輸入第一列
# awk '{if($6 > $7) print $1}' test
打印第六列大于第七列的行然後輸入第一列
# awk '/[Gg]reen/' test
打印包含Green或green的行
# awk '$1 ~ /^...a/' test
打印第一列第四個字符為a的行
# awk '$0 ~/(Yellow|Brown)/' test
打印test文件裏包含Yellow或者Brown的行
# awk '/^M/' test
打印以M開頭的行
# awk '{if ($1=="P.Bunny" && $4=="Yellow") print $0}' test
打印第一列匹配P.Bunny和第四列匹配Yellow的行
#awk '{if ($4=="Yellow" || $4~/Brown/) print $0}' test
打印第四列等于Yellow或者第四列包含Brown的行
# awk 'END{print NR}' test
打印test文件的行數
# awk '{print NF,NR,$0} END{print FILENAME}' test
7 1 M.Tans 5/99 48311 Green 8 40 44
7 2 J.Lulu 06/99 48317 green 9 24 26
7 3 P.Bunny 02/99 48 Yellow 12 35 28
7 4 J.Troll 07/99 4842 Brown-3 12 26 26
7 5 L.Tansl 05/99 4712 Brown-2 12 30 28
test
打印此行幾列此為第幾行最後輸出文件名
# awk '{if (NR>0 && $4~/Brown/)print $0}' test
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
# pwd
/home/gamester88/testlog
# echo $PWD | awk -F/ '{print $NF}'
testlog
# awk '{name=$1;belts=$4;if(belts ~/Yellow/) print name " is belt "belts}' test
P.Bunny is belt Yellow
# $ awk '{if ($6<$7) print $0}' test
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
#awk 'BEGIN{BASELINE="27"} {if ($6<BASELINE) print $0}'
J.Lulu 06/99 48317 green 9 24 26
J.Troll 07/99 4842 Brown-3 12 26 26
# awk '{if($1=="M.Tans") {$6=$6-1};print $1,$6,$7}' test
M.Tans 39 44
J.Lulu 24 26
P.Bunny 35 28
J.Troll 26 26
L.Tansl 30 28
# awk '{if($1=="M.Tans"){$6=$6-1;print $1,$6,$7}}' test
M.Tans 39 44
# awk '{if($1=="J.Troll") $1="J.L.Troll"; print $1}' test
M.Tans
J.Lulu
P.Bunny
J.L.Troll
L.Tansl
# awk '{if($1=="J.Troll") {$1="J.L.Troll"; print $1}}' test
J.L.Troll
# awk 'BEGIN {print "Name\tDifference"}{if($6<$7){$8=$7-$6;print $1,$8}}' test
Name Difference
M.Tans 4
J.Lulu 2
# awk 'BEGIN {print "Name\tDifference"}{if($6<$7){diff=$7-$6;print $1,diff}}' test
Name Difference
M.Tans 4
J.Lulu 2
# awk '(tot+=$6);END{print "Club student total points :" tot}' test
M.Tans 5/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansl 05/99 4712 Brown-2 12 30 28
Club student total points :155
#awk '{(tot+=$6)};END{print "Club student total points :" tot}' test
Club student total points :155
# ls -l | awk '/^[^d]/ {print $8"\t"$5} {tot+=$5} END {print "total KB:" tot}'
igowei.log 45
igowei.sh 509
test 172
tuoguan.sh 516
xian.sh 502
total KB:14032
# awk 'gsub(/4842/,4899){print $0}' test
J.Troll 07/99 4899 Brown-3 12 26 26
# awk 'gsub(/4842/,4899)' test
J.Troll 07/99 4899 Brown-3 12 26 26
把4842替換為4899
# awk 'BEGIN {print index("Bunny","ny")}' test
4
查詢ny字符串在Bunny的開始位置
# awk '$1=="M.Tans" {print length($1)" "$1}' test
6 M.Tans
M.Tans長度為6
# awk 'BEGIN{print length("A FEW GOOD MEN")}'
14
A FEW GOOD MEN長度為14
# awk 'BEGIN{print match("ANCD",/d/)}'
0
# awk 'BEGIN{print match("ANCD",/D/)}'
4
# awk '$1=="J.Lulu" {print match($1,"u")}' test
4
# awk 'BEGIN {print split("123-456-789",pats_array,"-")}'
3
# awk 'BEGIN {print split("123#456#789",myarray,"#")}'
3
# awk 'BEGIN {split("123#456#789",myarray,"#");print myarray[1]}'
123
# awk 'BEGIN {split("123#456#789",myarray,"#");print myarray[2]}'
456
substr操作
# awk '$1=="L.Tansl" {print substr($1,1,5)}' test
L.Tan
輸出$1的第一到第五字符
# awk '{print substr($1,3)}' test
Tans
Lulu
Bunny
Troll
Tansl
輸出$1,從第三個字符開始
#g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,然而,如果未指定目标,缺省为$ 0。
#i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符长度。
#m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将字符串s划分为指定序列a。
#s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的结果字符串e x p。
#s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被( r)匹配。
#s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。
# \ b 退格键
# \ t t a b键
# \ f 走纸换页
# \ d d d 八进制值
# \ n 新行
# \ c 任意其他特殊字符,例如\ \为反斜线符号
# \ r 回车键
printf参数printf([格式控制符],参数)
- 左对齐
Wi d t h 域的步长,用0表示0步长
. p r e c 最大字符串长度,或小数点右边的位数
% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如(1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换e或者f
% o 八进制数
% s 字符串
% x 十六进制数
awk内置变量
A R G C 命令行参数个数
A R G V 命令行参数排列
E N V I R O N 支持队列中系统环境变量的使用
FILENAME a w k浏览的文件名
F N R 浏览文件的记录数
F S 设置输入域分隔符,等价于命令行- F选项
N F 浏览记录的域个数
N R 已读的记录数
O F S 输出域分隔符
O R S 输出记录分隔符
R S 控制记录分隔符
A R G C支持命令行中传入a w k脚本的参数个数。A R G V是A R G C的参数排列数组,其中每一元素表示为A R G V [ n ],n为期望访问的命令行参数。
E N V I R O N 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如E N V I R O N [“E D I TO R”] =“Vi”。
F I L E N A M E支持a w k脚本实际操作的输入文件。因为a w k可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。
F N R支持a w k目前操作的记录数。其变量值小于等于N R。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。
F S用来在a w k中设置域分隔符,与命令行中- F选项功能相同。缺省情况下为空格。如果用逗号来作域分隔符,设置F S = ","。
N F支持记录域个数,在记录被读之后再设置。
O F S允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
O R S为输出记录分隔符,缺省为新行( \ n)。
R S是记录分隔符,缺省为新行( \ n )。
###############################grep选项##############################################
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
此模式有三种形式,即:
pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数.
#awk 'NR==FNR{a[$3]++;next}a[$3]==1' file file
$3重复的不显示
#awk 'NR==FNR{a[$1]=$2;next}{$2=$2-a[$1]}2' file1 file2
file2的$2减file1的$2
#echo "<xml>abc.whatever<a><sss>xxxcvvv<bbb></xml>"|grep -Eo "[^>]*\.[^<]*"
提前abc.whatever
相关阅读 更多 +