- #cat file
- M.Tansley 05/99 48311 Green 8 40 44
- L.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.Tansley 05/99 4712 Brown-2 12 30 28
- ***【条件操作】***
- awk 匹配
- 1、模糊匹配
- #awk '{if($4~/Brown/) print $0}' file
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
- 2、精确匹配
- #awk '$4=="Brown-3" {print $0}' file
- J.Troll 07/99 4842 Brown-3 12 26 26
- awk 不匹配
- #awk '{if($4!~/Brown/) print $0}' file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Lulu 06/99 48317 green 9 24 26
- P.Bunny 02/99 48 Yellow 12 35 28
- #awk '$4!~/Brown/' file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Lulu 06/99 48317 green 9 24 26
- P.Bunny 02/99 48 Yellow 12 35 28
- (默认情况下,awk将会打印所有匹配记录,因此这里不必加入动作部分!)
- awk小于
- #awk '{if($6<$7) print $0"\t" ""$1" Try better at next comp"}' file
- M.Tansley 05/99 48311 Green 8 40 44 M.Tansley Try better at next comp
- L.Lulu 06/99 48317 green 9 24 26 L.Lulu Try better at next comp
- awk 小于等于
- #awk '{if($6 <= $7) print $0}' file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Lulu 06/99 48317 green 9 24 26
- J.Troll 07/99 4842 Brown-3 12 26 26
- awk 匹配大小写
- #awk '/[Gg]reen/' file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Lulu 06/99 48317 green 9 24 26
- awk 任意字符(第四个字符是a的行)
- #awk '$4 ~/^...a/' file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Tansley 05/99 4712 Brown-2 12 30 28
- awk 或者
- #awk '$0~/(Yellow|Brown)/' file
- P.Bunny 02/99 48 Yellow 12 35 28
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
- awk 行首
- #awk '/^48/' input-file
- awk 逻辑关系 && || !
- 1、与逻辑
- #awk '{if($1=="L.Lulu" && $4=="green") print $0}' file
- L.Lulu 06/99 48317 green 9 24 26
- 2、或逻辑
- #awk '{if($1=="L.Lulu" || $4~/Brown/) print $0}' file
- L.Lulu 06/99 48317 green 9 24 26
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
- 3、非逻辑
- #awk '{if($7!="26") print $0}' file
- M.Tansley 05/99 48311 Green 8 40 44
- P.Bunny 02/99 48 Yellow 12 35 28
- L.Tansley 05/99 4712 Brown-2 12 30 28
- ***【awk内置变量】
- ARGC(命令行参数个数) AWK脚本参数个数
- ARGV(命令行参数排列) ARGV[n]
- ENVIRON(支持系统环境变量设置)
- FILENAME(awk浏览的文件名)告知系统目前正在浏览的实际文件
- FNR(浏览文件的记录数)
- FS(域分割符) -F
- NF(浏览记录的域个数) 支持记录域个数
- NR(已读的记录数)
- OFS(输出域分割符) 默认为空格,如果想设置为#,写入OFS=“#”
- ORS(输出记录分割符) 默认为新行 \n
- RS(控制记录分割符) 默认为新行 \n
- 1、NF。NR。FILENAME
- #awk '{print NF,NR,$0} END{print FILENAME}' file
- 7 1 M.Tansley 05/99 48311 Green 8 40 44 (域个数,已读记录数)
- 7 2 L.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.Tansley 05/99 4712 Brown-2 12 30 28
- file (文件名)
- #awk '{if(NR>0 && $4~/Brown/) print $0}' file
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
- #echo "/usr/local/bin/gls-makebridge" |awk -F/ '{print $NF}' (显示文件名,显示最后一级名字)
- gls-makebridge
- ***【awk操作符】***
- = += *= /= %= ^= 赋值操作符
- ? 条件表达操作符
- || && ! 或与非
- ~ !~ 匹配与不匹配
- < <= == != >> 关系操作符
- + - * / % ^ 算数操作符
- + + -- 前缀和后缀
- 1、设置变量名
- #awk '{name=$1;belts=$4;print name" is belt "belts}' file
- M.Tansley is belt Green
- L.Lulu is belt green
- P.Bunny is belt Yellow
- J.Troll is belt Brown-3
- L.Tansley is belt Brown-2
- #awk '{name=$1;belts=$4;if($4~/Yellow/)print name" is belt "belts}' file
- P.Bunny is belt Yellow
- 2、域值比较
- a、在BEGIN中给变量赋值 (很有益的)
- b、在关系操作中使用实际数值 (使用关系操作必须用圆括号括起来)
- #awk 'BEGIN{kevin="27"} {if($6<kevin) print $0}' file
- L.Lulu 06/99 48317 green 9 24 26
- J.Troll 07/99 4842 Brown-3 12 26 26
- #awk '{if($6<27) print $0}' file
- L.Lulu 06/99 48317 green 9 24 26
- J.Troll 07/99 4842 Brown-3 12 26 26
- 3、修改数值域取值
- 找出名字为M.Tansley的人,将他的成绩减1.
- #awk '{if($1=="M.Tansley")$6=$6-1;print $1,$6,$7}' file
- M.Tansley 39 44 (之前为40,现在为39)
- L.Lulu 24 26
- P.Bunny 35 28
- J.Troll 26 26
- L.Tansley 30 28
- 4、修改文本域
- 将J.Troll修改为J.L.Troll (字符串要是用双秒号“”)
- #awk '{if($1=="J.Troll")$1="J.L.Troll";print $1}' file
- M.Tansley
- L.Lulu
- P.Bunny
- J.L.Troll (已经改过了)
- L.Tansley
- 5、只显示修改过的记录 (注意是花括号,合并命令)
- #awk '{if($1=="J.Troll"){$1="J.L.Troll";print $1}}' file
- J.L.Troll
- 6、创建新的输出域
- 创建域8保存目前级别分与域最高级别分的减法值
- #awk 'BEGIN{print "Name\tDifferents"}{if($6<$7){diff=$7-$6;print $1"\t"diff}}' file
- Name Differents
- M.Tansley 4
- L.Lulu 2
- 7、增加列值 (统计总分)
- #awk '(tot+=$6);END{print "Club student total points: "tot}' file
- 如果只想看结果而不打印其它的,那就这样
- #awk '{(tot+=$6)};END{print "Club student total points: "tot}' file
- 8、文件长度增加 (查看文件名及对应的文件大小,最后统计总大小)
- #ls -l |awk '/^[^d]/ {print $9"\t"$5}{tot+=$5} END{print "total KB: "tot}'
- RH255-10_系统监控和日志.pdf 224733
- RH255-11_集中和安全存储.pdf 279593
- RH255-12_通过SSL封装的WEB服务.pdf 403115
- RH255-13_WEB服务器其他配置.pdf 221958
- RH255-14_基本SMTP配置.pdf 320628
- RH255-15_仅缓存DNS服务器.pdf 213914
- RH255-16_通过NFS共享文件.pdf 228612
- RH255-17_通过CIFS共享文件.pdf 215369
- RH255-18_通过FTP共享文件.pdf 128581
- RH255-19_对引导过程进行故障排除.pdf 200583
- RH255-1_从教室环境入门.pdf 242201
- RH255-2_增强用户安全.pdf 264396
- RH255-3_BASH脚本编程和工具.pdf 340625
- RH255-4_通过GNUPG保护文件安全.pdf 185014
- RH255-5_包管理.pdf 272382
- RH255-6_网络监控.pdf 203533
- RH255-7_高级网络配置.pdf 255007
- RH255-8_保护网络通信.pdf 317654
- RH255-9_NTP服务器配置.pdf 189784
- total KB: 4707682
- ***【内置的字符串函数】***
- gsub(r,s) 在整个$0中用s替代r
- gsub(r,s,t) 在整个t中用s替代r
- index(s,t) 返回s中字符串t的第一位置
- length(s) 返回s长度
- match(s,r) 测试s是否包含匹配r的字符串
- split(s,a,fs) 在fs上将s分成序列a
- sprint(fmt,exp) 返回经fmt格式化后的exp
- sub(r,s) 用$0中最左边最长的子字符串代替s
- substr(s,p) 返回字符串s中从p开始的后缀部分
- substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
- gsub函数有点类似于sed查找和替换。第一个函数作用于记录$0,第二个函数gsub函数允许指定目标。未指定目标则默认为
- $0.
- index(s,t)函数返回目标字符串s中查询字符串t的首位置.length函数返回字符串s字符长度.
- split使用域分割符fs将字符串s划分为指定序列a。
- 1、gsub (目标模式/,替换为/)
- #awk 'gsub(4842,4899){print $0}' file
- J.Troll 07/99 4899 Brown-3 12 26 26
- 2、index (必须用双引号将字符串括起来)
- #awk 'BEGIN{print index("Bunny","ny")}'
- 4
- 3、length (返回所需字符串的长度)
- #awk '$1=="J.Troll" {print length($1)"\t"$1}' file
- 7 J.Troll
- #awk 'BEGIN{print length("A FEW GOOD MEN")}' (为什么不加BEGIN会显示5行的14?每读一行数据就要输出一次长度,所以有5行。这里把这个放到BEGIN那里预处理,预处理不需要后面加文件的。)
- 14
- 4、match (测试目标字符串中是否包含查找字符的一部分)
- #awk 'BEGIN{print match("ANCD","d")}' (未找到所以显示0)
- 0
- #awk 'BEGIN{print match("ANCD","D")}' (找到,在第四位上)
- 4
- #awk '$1=="L.Lulu" {print match($1,"u")}' file
- 4
- 5、split (返回字符串数组元素个数)
- #awk 'BEGIN{print split("123#456#789",myarray,"#")}' (字符串必须用双引号括起来)
- 3
- 6、substr (按照起始位置及长度返回字符串的一部分)
- #awk '$1=="L.Tansley"{print substr($1,2,6)}' file (将$1的第二到第五个字符截取出来)
- 利用这个截取可以小试一下截取ip:
- a、#ifconfig br0
- br0 Link encap:Ethernet HWaddr 00:1E:37:D2:9F:FD
- inet addr:192.168.0.24 Bcast:192.168.0.255 Mask:255.255.255.0
- inet6 addr: fe80::21e:37ff:fed2:9ffd/64 Scope:Link
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:402571 errors:0 dropped:0 overruns:0 frame:0
- TX packets:202353 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:386613583 (368.7 MiB) TX bytes:17539566 (16.7 MiB)
- b、#ifconfig br0 |awk '{print substr($2,6,20)}' | grep "\." (6-20位是ip地址)
- 192.168.0.24
- #awk '{print substr($1,3)}' file (对全文第一区域的数据从第三位开始显示)
- Tansley
- Lulu
- Bunny
- Troll
- Tansley
- #awk 'BEGIN{str="A FEW GOOD MEN"} END{print substr(str,7)}' file
- GOOD MEN (将字符串str从第七位开始截取,结果是”GOOD MEN“)
- 8、从shell中想awk传入字符串
- #echo stand-by haha | awk '{print length($0)}'
- 13
- #echo stand-by haha | awk '{print length($1)}'
- 8
- #echo stand-by haha | awk '{print length($2)}'
- 4
- 设置一文件名为变量,管道输出到awk.
- #str=mydoc.txt
- #echo $str |awk '{print substr($str,1,5)}' (返回不带扩展名的文件名)
- mydoc
- #echo $str |awk '{print substr($str,7,20)}' (只返回扩展名,末尾字符任意)
- ***【字符串屏蔽序列】***
- \b 退格键 \t tab键 \f 走纸换页
- \ddd 八进制值 \n 换行 \c 任意其它字符
- \r 回车键
- #awk 'BEGIN{print "\nMay\tDay\n\nMay\t\104\141\171"}'
- May Day
- May Day (\104为D的八进制ASCII码,\141为a,\171为y)
- ***【awk输出函数printf】***
- [修饰符]
- - 左对齐 Width 域的步长,用0表示0步长 .prec 最大字符串长度,或小数点右边的位数
- [格式]
- %c ASCII码字符 %d 整数 %e 浮点数,科学计数法
- %f 浮点数,如1.23 %g awk决定使用哪种浮点数 %o 八进制数
- %s 字符串 %x 十六进制数
- 1、字符转换
- #echo 65|awk '{printf "%c\n",$0}' 或者 #awk '{printf "%c\n",65}'
- A
- #awk 'BEGIN{printf "%f\n",999}' (浮点数转换)
- 999.000000
- 2、格式化输出
- 要求名字左对齐,15个字符长度,后跟序列号。
- #awk '{printf "%-20s %3s %6s\n",$1,$3,$5}' file
- M.Tansley 48311 8 ($1-$3间距20个字符)
- L.Lulu 48317 9
- P.Bunny 48 12
- J.Troll 4842 12
- L.Tansley 4712 12
- 修饰一下:
- #awk 'BEGIN{print "Name\tS\tNumber"}{printf "%-10s %3s %6s\n",$1,$3,$5}' file
- Name S Number (多一行注释)
- M.Tansley 48311 8
- L.Lulu 48317 9
- P.Bunny 48 12
- J.Troll 4842 12
- L.Tansley 4712 12
- 3、向一行awk命令传值
- 命令: awk 命令变量=输入文件值
- #awk '{if($5<age) print $0}' age=10 file
- M.Tansley 05/99 48311 Green 8 40 44
- L.Lulu 06/99 48317 green 9 24 26
- #df -k |awk '($4~/^[0-9]/ && $4!~/%/) {if($4<lowfree) print $1"\t"$4}' lowfree=65000
- /dev/sda1 35240 (查看可用空间小于65M的分区)
- #who |awk '{print $1" is logged on"}' (查看当前谁登录主机)
- root is logged on
- #who |awk '{if($1==user) print $1" you are connected to "$2}' user=$LOGNAME
- root you are connected to tty1 (效果等价于上面,这里是传递参数)
- 4、awk脚本文件
- #vim student_tot.awk
- ! /bin/gawk -f
- #prints total and average of club student points
- #print a hearder first
- BEGIN{
- print "Student Date Member No.Grade Age Points Max"
- print "Name Joined Gained Point Available"
- print "================================================================"
- }
- #let's add the scores of points gained
- (tot+=$6)
- #finished processing now let's print the total and average point
- END{print "Club student total points: " tot
- print "Average Club Student points: " tot/NR}
- 5、在awk中使用FS变量
- #vim passwd.awk
- !/usr/bin/awk -f
- BEGIN{
- FS=":"}
- {print $1,"\t",$5}
- 6、向awk脚本传值
- awk script_file var=value input_file
- =========================
- #vim fieldcheck.awk
- !/usr/bin/awk -f
- NF!=MAX{
- print("line " NR "does not have "MAX" fields")}
- #sh fieldcheck.awk MAX=7 FS=":" /etc/passwd
- =========================
- #vim name.awk
- !/usr/bin/awk -f
- {if($5 < age)
- print $0}
- #sh name.awk age=10 file
- =========================
- # vim duawk.awk
- !/usr/bin/awk -f
- BEGIN{
- OFS="\t" ;
- print "name" "\t\t","bytes","blocks\n"
- print "=============================="}
- {print $2,"\t\t",$1*512,$1}
- # du |duawk.awk
- =========================
- 9、awk数组
- # vim arraytest.awk
- #!/usr/bin/awk -f
- BEGIN{
- record="123#456#789";
- split(record,myarray,"#")}
- END{for(i in myarray) {print myarray[i]}}
- # sh arraytest.awk /dev/null
- =========================
2012-3-20练习笔记