1. #cat file 
  2. M.Tansley   05/99   48311   Green   8   40  44 
  3. L.Lulu  06/99   48317   green   9   24  26 
  4. P.Bunny 02/99   48  Yellow  12  35  28 
  5. J.Troll 07/99   4842    Brown-3 12  26  26 
  6. L.Tansley   05/99   4712    Brown-2 12  30  28 
  7.  
  8. ***【条件操作】*** 
  9.  
  10. awk 匹配 
  11. 1、模糊匹配 
  12. #awk '{if($4~/Brown/) print $0}' file 
  13. J.Troll 07/99   4842    Brown-3 12  26  26 
  14. L.Tansley   05/99   4712    Brown-2 12  30  28 
  15. 2、精确匹配 
  16. #awk '$4=="Brown-3" {print $0}' file 
  17. J.Troll 07/99   4842    Brown-3 12  26  26 
  18.  
  19. awk 不匹配 
  20. #awk '{if($4!~/Brown/) print $0}' file 
  21. M.Tansley   05/99   48311   Green   8   40  44 
  22. L.Lulu  06/99   48317   green   9   24  26 
  23. P.Bunny 02/99   48  Yellow  12  35  28 
  24.  
  25. #awk '$4!~/Brown/' file  
  26. M.Tansley   05/99   48311   Green   8   40  44 
  27. L.Lulu  06/99   48317   green   9   24  26 
  28. P.Bunny 02/99   48  Yellow  12  35  28 
  29. (默认情况下,awk将会打印所有匹配记录,因此这里不必加入动作部分!) 
  30.  
  31. awk小于 
  32. #awk '{if($6<$7) print $0"\t" ""$1" Try better at next comp"}' file 
  33. M.Tansley   05/99   48311   Green   8   40  44  M.Tansley Try better at next comp 
  34. L.Lulu  06/99   48317   green   9   24  26  L.Lulu Try better at next comp 
  35.  
  36. awk 小于等于 
  37. #awk '{if($6 <= $7) print $0}' file 
  38. M.Tansley   05/99   48311   Green   8   40  44 
  39. L.Lulu  06/99   48317   green   9   24  26 
  40. J.Troll 07/99   4842    Brown-3 12  26  26 
  41.  
  42. awk 匹配大小写 
  43. #awk '/[Gg]reen/' file 
  44. M.Tansley   05/99   48311   Green   8   40  44 
  45. L.Lulu  06/99   48317   green   9   24  26 
  46.  
  47. awk 任意字符(第四个字符是a的行) 
  48. #awk '$4 ~/^...a/' file 
  49. M.Tansley   05/99   48311   Green   8   40  44 
  50. L.Tansley   05/99   4712    Brown-2 12  30  28 
  51.  
  52. awk 或者 
  53. #awk '$0~/(Yellow|Brown)/' file 
  54. P.Bunny 02/99   48  Yellow  12  35  28 
  55. J.Troll 07/99   4842    Brown-3 12  26  26 
  56. L.Tansley   05/99   4712    Brown-2 12  30  28 
  57.  
  58. awk 行首 
  59. #awk '/^48/' input-file 
  60.  
  61. awk 逻辑关系 && || ! 
  62. 1、与逻辑 
  63. #awk '{if($1=="L.Lulu" && $4=="green") print $0}' file 
  64. L.Lulu  06/99   48317   green   9   24  26 
  65.  
  66. 2、或逻辑 
  67. #awk '{if($1=="L.Lulu" || $4~/Brown/) print $0}' file 
  68. L.Lulu  06/99   48317   green   9   24  26 
  69. J.Troll 07/99   4842    Brown-3 12  26  26 
  70. L.Tansley   05/99   4712    Brown-2 12  30  28 
  71.  
  72. 3、非逻辑 
  73. #awk '{if($7!="26") print $0}' file 
  74. M.Tansley   05/99   48311   Green   8   40  44 
  75. P.Bunny 02/99   48  Yellow  12  35  28 
  76. L.Tansley   05/99   4712    Brown-2 12  30  28 
  77.  
  78. ***【awk内置变量】 
  79. ARGC(命令行参数个数)   AWK脚本参数个数 
  80. ARGV(命令行参数排列)   ARGV[n] 
  81. ENVIRON(支持系统环境变量设置) 
  82. FILENAME(awk浏览的文件名)告知系统目前正在浏览的实际文件 
  83. FNR(浏览文件的记录数)    
  84. FS(域分割符)        -F 
  85. NF(浏览记录的域个数)    支持记录域个数 
  86. NR(已读的记录数)       
  87. OFS(输出域分割符) 默认为空格,如果想设置为#,写入OFS=“#” 
  88. ORS(输出记录分割符)    默认为新行 \n 
  89. RS(控制记录分割符) 默认为新行 \n 
  90.  
  91. 1、NF。NR。FILENAME 
  92. #awk '{print NF,NR,$0} END{print FILENAME}' file 
  93. 7 1 M.Tansley   05/99   48311   Green   8   40  44  (域个数,已读记录数) 
  94. 7 2 L.Lulu  06/99   48317   green   9   24  26 
  95. 7 3 P.Bunny 02/99   48  Yellow  12  35  28 
  96. 7 4 J.Troll 07/99   4842    Brown-3 12  26  26 
  97. 7 5 L.Tansley   05/99   4712    Brown-2 12  30  28 
  98. file    (文件名) 
  99.  
  100. #awk '{if(NR>0 && $4~/Brown/) print $0}' file 
  101. J.Troll 07/99   4842    Brown-3 12  26  26 
  102. L.Tansley   05/99   4712    Brown-2 12  30  28 
  103.  
  104. #echo "/usr/local/bin/gls-makebridge" |awk -F/ '{print $NF}'    (显示文件名,显示最后一级名字) 
  105. gls-makebridge 
  106.  
  107. ***【awk操作符】*** 
  108. = += *= /= %= ^= 赋值操作符 
  109. ? 条件表达操作符 
  110. || && ! 或与非 
  111. ~ !~ 匹配与不匹配 
  112. < <= == != >> 关系操作符 
  113. + - * / % ^ 算数操作符 
  114. + + -- 前缀和后缀 
  115.  
  116. 1、设置变量名 
  117. #awk '{name=$1;belts=$4;print name" is belt "belts}' file 
  118. M.Tansley is belt Green 
  119. L.Lulu is belt green 
  120. P.Bunny is belt Yellow 
  121. J.Troll is belt Brown-3 
  122. L.Tansley is belt Brown-2 
  123.  
  124. #awk '{name=$1;belts=$4;if($4~/Yellow/)print name" is belt "belts}' file 
  125. P.Bunny is belt Yellow 
  126.  
  127. 2、域值比较 
  128. a、在BEGIN中给变量赋值  (很有益的) 
  129. b、在关系操作中使用实际数值  (使用关系操作必须用圆括号括起来) 
  130.  
  131. #awk 'BEGIN{kevin="27"} {if($6<kevin) print $0}' file 
  132. L.Lulu  06/99   48317   green   9   24  26 
  133. J.Troll 07/99   4842    Brown-3 12  26  26 
  134.  
  135. #awk '{if($6<27) print $0}' file 
  136. L.Lulu  06/99   48317   green   9   24  26 
  137. J.Troll 07/99   4842    Brown-3 12  26  26 
  138.  
  139. 3、修改数值域取值 
  140. 找出名字为M.Tansley的人,将他的成绩减1. 
  141. #awk '{if($1=="M.Tansley")$6=$6-1;print $1,$6,$7}' file 
  142. M.Tansley 39 44 (之前为40,现在为39
  143. L.Lulu 24 26 
  144. P.Bunny 35 28 
  145. J.Troll 26 26 
  146. L.Tansley 30 28 
  147.  
  148. 4、修改文本域 
  149. 将J.Troll修改为J.L.Troll    (字符串要是用双秒号“”) 
  150. #awk '{if($1=="J.Troll")$1="J.L.Troll";print $1}' file 
  151. M.Tansley 
  152. L.Lulu 
  153. P.Bunny 
  154. J.L.Troll   (已经改过了) 
  155. L.Tansley 
  156.  
  157. 5、只显示修改过的记录 (注意是花括号,合并命令) 
  158. #awk '{if($1=="J.Troll"){$1="J.L.Troll";print $1}}' file 
  159. J.L.Troll 
  160.  
  161. 6、创建新的输出域 
  162. 创建域8保存目前级别分与域最高级别分的减法值 
  163. #awk 'BEGIN{print "Name\tDifferents"}{if($6<$7){diff=$7-$6;print $1"\t"diff}}' file 
  164. Name    Differents 
  165. M.Tansley   4 
  166. L.Lulu  2 
  167.  
  168. 7、增加列值  (统计总分) 
  169. #awk '(tot+=$6);END{print "Club student total points: "tot}' file 
  170. 如果只想看结果而不打印其它的,那就这样 
  171. #awk '{(tot+=$6)};END{print "Club student total points: "tot}' file 
  172.  
  173. 8、文件长度增加    (查看文件名及对应的文件大小,最后统计总大小) 
  174. #ls -l |awk '/^[^d]/ {print $9"\t"$5}{tot+=$5} END{print "total KB: "tot}' 
  175. RH255-10_系统监控和日志.pdf    224733 
  176. RH255-11_集中和安全存储.pdf    279593 
  177. RH255-12_通过SSL封装的WEB服务.pdf  403115 
  178. RH255-13_WEB服务器其他配置.pdf 221958 
  179. RH255-14_基本SMTP配置.pdf   320628 
  180. RH255-15_仅缓存DNS服务器.pdf  213914 
  181. RH255-16_通过NFS共享文件.pdf  228612 
  182. RH255-17_通过CIFS共享文件.pdf 215369 
  183. RH255-18_通过FTP共享文件.pdf  128581 
  184. RH255-19_对引导过程进行故障排除.pdf    200583 
  185. RH255-1_从教室环境入门.pdf 242201 
  186. RH255-2_增强用户安全.pdf  264396 
  187. RH255-3_BASH脚本编程和工具.pdf 340625 
  188. RH255-4_通过GNUPG保护文件安全.pdf   185014 
  189. RH255-5_包管理.pdf 272382 
  190. RH255-6_网络监控.pdf    203533 
  191. RH255-7_高级网络配置.pdf  255007 
  192. RH255-8_保护网络通信.pdf  317654 
  193. RH255-9_NTP服务器配置.pdf    189784 
  194. total KB: 4707682 
  195.  
  196. ***【内置的字符串函数】*** 
  197. gsub(r,s)   在整个$0中用s替代r 
  198. gsub(r,s,t) 在整个t中用s替代r 
  199. index(s,t)  返回s中字符串t的第一位置 
  200. length(s)   返回s长度 
  201. match(s,r)  测试s是否包含匹配r的字符串 
  202. split(s,a,fs)   在fs上将s分成序列a 
  203. sprint(fmt,exp) 返回经fmt格式化后的exp 
  204. sub(r,s)    用$0中最左边最长的子字符串代替s 
  205. substr(s,p) 返回字符串s中从p开始的后缀部分 
  206. substr(s,p,n)   返回字符串s中从p开始长度为n的后缀部分 
  207.  
  208. gsub函数有点类似于sed查找和替换。第一个函数作用于记录$0,第二个函数gsub函数允许指定目标。未指定目标则默认为 
  209. $0. 
  210. index(s,t)函数返回目标字符串s中查询字符串t的首位置.length函数返回字符串s字符长度. 
  211. split使用域分割符fs将字符串s划分为指定序列a。 
  212.  
  213. 1、gsub  (目标模式/,替换为/) 
  214. #awk 'gsub(4842,4899){print $0}' file 
  215. J.Troll 07/99   4899    Brown-3 12  26  26 
  216.  
  217. 2、index (必须用双引号将字符串括起来) 
  218. #awk 'BEGIN{print index("Bunny","ny")}' 
  219. 4 
  220.  
  221. 3、length (返回所需字符串的长度) 
  222. #awk '$1=="J.Troll" {print length($1)"\t"$1}' file 
  223. 7   J.Troll 
  224. #awk 'BEGIN{print length("A FEW GOOD MEN")}' (为什么不加BEGIN会显示5行的14?每读一行数据就要输出一次长度,所以有5行。这里把这个放到BEGIN那里预处理,预处理不需要后面加文件的。) 
  225. 14 
  226.  
  227. 4、match (测试目标字符串中是否包含查找字符的一部分) 
  228. #awk 'BEGIN{print match("ANCD","d")}'   (未找到所以显示0) 
  229. 0 
  230. #awk 'BEGIN{print match("ANCD","D")}'   (找到,在第四位上) 
  231. 4 
  232. #awk '$1=="L.Lulu" {print match($1,"u")}' file 
  233. 4 
  234.  
  235. 5、split (返回字符串数组元素个数) 
  236. #awk 'BEGIN{print split("123#456#789",myarray,"#")}'    (字符串必须用双引号括起来) 
  237. 3 
  238.  
  239. 6、substr (按照起始位置及长度返回字符串的一部分) 
  240. #awk '$1=="L.Tansley"{print substr($1,2,6)}' file   (将$1的第二到第五个字符截取出来) 
  241. 利用这个截取可以小试一下截取ip: 
  242. a、#ifconfig br0 
  243. br0       Link encap:Ethernet  HWaddr 00:1E:37:D2:9F:FD   
  244.           inet addr:192.168.0.24  Bcast:192.168.0.255  Mask:255.255.255.0 
  245.           inet6 addr: fe80::21e:37ff:fed2:9ffd/64 Scope:Link 
  246.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
  247.           RX packets:402571 errors:0 dropped:0 overruns:0 frame:0 
  248.           TX packets:202353 errors:0 dropped:0 overruns:0 carrier:0 
  249.           collisions:0 txqueuelen:0  
  250.           RX bytes:386613583 (368.7 MiB)  TX bytes:17539566 (16.7 MiB) 
  251.  
  252. b、#ifconfig br0 |awk '{print substr($2,6,20)}' | grep "\." (6-20位是ip地址) 
  253. 192.168.0.24 
  254.  
  255. #awk '{print substr($1,3)}' file    (对全文第一区域的数据从第三位开始显示) 
  256. Tansley 
  257. Lulu 
  258. Bunny 
  259. Troll 
  260. Tansley 
  261.  
  262. #awk 'BEGIN{str="A FEW GOOD MEN"} END{print substr(str,7)}' file  
  263. GOOD MEN    (将字符串str从第七位开始截取,结果是”GOOD MEN“) 
  264.  
  265. 8、从shell中想awk传入字符串 
  266. #echo stand-by haha | awk '{print length($0)}' 
  267. 13 
  268. #echo stand-by haha | awk '{print length($1)}' 
  269. 8 
  270. #echo stand-by haha | awk '{print length($2)}' 
  271. 4 
  272.  
  273. 设置一文件名为变量,管道输出到awk. 
  274. #str=mydoc.txt 
  275. #echo $str |awk '{print substr($str,1,5)}'  (返回不带扩展名的文件名) 
  276. mydoc 
  277. #echo $str |awk '{print substr($str,7,20)}' (只返回扩展名,末尾字符任意) 
  278.  
  279. ***【字符串屏蔽序列】*** 
  280. \b 退格键  \t tab键 \f 走纸换页 
  281. \ddd 八进制值   \n 换行       \c 任意其它字符 
  282. \r 回车键 
  283.  
  284. #awk 'BEGIN{print "\nMay\tDay\n\nMay\t\104\141\171"}' 
  285.  
  286. May Day 
  287.  
  288. May Day (\104为D的八进制ASCII码,\141为a,\171为y) 
  289.  
  290. ***【awk输出函数printf】*** 
  291. [修饰符] 
  292. - 左对齐       Width 域的步长,用0表示0步长  .prec 最大字符串长度,或小数点右边的位数 
  293. [格式] 
  294. %c ASCII码字符 %d 整数       %e 浮点数,科学计数法 
  295. %f 浮点数,如1.23 %g awk决定使用哪种浮点数    %o 八进制数 
  296. %s 字符串  %x 十六进制数 
  297.  
  298. 1、字符转换 
  299. #echo 65|awk '{printf "%c\n",$0}' 或者 #awk '{printf "%c\n",65}' 
  300.  
  301. #awk 'BEGIN{printf "%f\n",999}' (浮点数转换) 
  302. 999.000000 
  303.  
  304. 2、格式化输出 
  305. 要求名字左对齐,15个字符长度,后跟序列号。 
  306. #awk '{printf "%-20s %3s %6s\n",$1,$3,$5}' file 
  307. M.Tansley            48311      8   ($1-$3间距20个字符) 
  308. L.Lulu               48317      9 
  309. P.Bunny               48     12 
  310. J.Troll              4842     12 
  311. L.Tansley            4712     12 
  312. 修饰一下: 
  313. #awk 'BEGIN{print "Name\tS\tNumber"}{printf "%-10s %3s %6s\n",$1,$3,$5}' file 
  314. Name    S   Number  (多一行注释) 
  315. M.Tansley  48311      8 
  316. L.Lulu     48317      9 
  317. P.Bunny     48     12 
  318. J.Troll    4842     12 
  319. L.Tansley  4712     12 
  320.  
  321. 3、向一行awk命令传值 
  322. 命令: awk 命令变量=输入文件值 
  323. #awk '{if($5<age) print $0}' age=10 file 
  324. M.Tansley   05/99   48311   Green   8   40  44 
  325. L.Lulu  06/99   48317   green   9   24  26 
  326.  
  327. #df -k |awk '($4~/^[0-9]/ && $4!~/%/) {if($4<lowfree) print $1"\t"$4}' lowfree=65000 
  328. /dev/sda1   35240   (查看可用空间小于65M的分区) 
  329.  
  330. #who |awk '{print $1" is logged on"}'   (查看当前谁登录主机) 
  331. root is logged on 
  332.  
  333. #who |awk '{if($1==user) print $1" you are connected to "$2}' user=$LOGNAME 
  334. root you are connected to tty1  (效果等价于上面,这里是传递参数) 
  335.  
  336. 4、awk脚本文件 
  337. #vim student_tot.awk  
  338.  
  339. ! /bin/gawk -f 
  340. #prints total and average of club student points 
  341.  
  342. #print a hearder first 
  343. BEGIN{ 
  344. print "Student  Date    Member  No.Grade  Age   Points  Max" 
  345. print "Name     Joined                          Gained  Point Available" 
  346. print "================================================================" 
  347.  
  348. #let's add the scores of points gained 
  349. (tot+=$6
  350.  
  351. #finished processing now let's print the total and average point 
  352. END{print "Club student total points: " tot 
  353.         print "Average Club Student points: " tot/NR} 
  354.  
  355. 5、在awk中使用FS变量 
  356. #vim passwd.awk  
  357. !/usr/bin/awk -f 
  358. BEGIN{ 
  359. FS=":"
  360. {print $1,"\t",$5
  361.  
  362. 6、向awk脚本传值 
  363. awk script_file var=value input_file 
  364. ========================= 
  365. #vim fieldcheck.awk 
  366.  
  367. !/usr/bin/awk -f 
  368. NF!=MAX{ 
  369. print("line " NR "does not have "MAX" fields")} 
  370.  
  371. #sh fieldcheck.awk MAX=7 FS=":" /etc/passwd 
  372. ========================= 
  373. #vim name.awk 
  374. !/usr/bin/awk -f 
  375. {if($5 < age) 
  376.  print $0
  377.  
  378. #sh name.awk age=10 file  
  379. ========================= 
  380. # vim duawk.awk 
  381.  
  382. !/usr/bin/awk -f 
  383. BEGIN{ 
  384. OFS="\t" ; 
  385. print "name" "\t\t","bytes","blocks\n" 
  386. print "=============================="
  387. {print $2,"\t\t",$1*512,$1
  388.  
  389. # du |duawk.awk 
  390. ========================= 
  391.  
  392. 9、awk数组 
  393. # vim arraytest.awk 
  394.  
  395. #!/usr/bin/awk -f 
  396. BEGIN{ 
  397. record="123#456#789"
  398. split(record,myarray,"#")} 
  399.  END{for(i in myarray) {print myarray[i]}} 
  400.  
  401. # sh arraytest.awk /dev/null 
  402. ========================= 
2012-3-20练习笔记