awk 的特色nginx
文本与数据的处理工具; 可编程: 处理灵活, 功能强大;正则表达式
awk 应用编程
awk 处理方式 与 格式数组
awk 处理方式服务器
awk 格式函数
awk 内置参数的应用工具
// awk 打印多个内容; awk -F ":" '{print $1,$3}' passwd // 使用逗号分隔,打印的内容以空格分隔; ... ... tian 502 awk -F ":" '{print $1"------"$3}' passwd // 使用指定的符号进行分隔; ... ... tian------502 awk -F ":" '{print "UserName:"$1" ""UUID:"$3}' passwd // 添加相应内容的说明; ... ... UserName:tian UUID:502 // awk 使用 NR , NF , FILENAME 参数; awk -F ":" '{print NR,NF}' passwd // 使用 NR 打印行号, NF 打印多少个字段; ... ... 27 7 28 7 awk -F ":" '{print FILENAME}' passwd // 每行都打印处理的文件名; ... ... passwd passwd // ****************************** 案例 一 ********************************** ''' 显示 passwd 每行的行号, 每行的列数, 对应行的用户名, 使用 print 和 printf() 两种方法实现 ''' awk -F ":" '{print NR" "NF" "$1}' passwd // 使用 print; ... ... 27 7 zxjr 28 7 tian awk -F ":" '{printf("%2s %s %s\n",NR,NF,$1)}' passwd // 使用 printf() 函数; ... ... // 2 表示占用的字符数, 使打印更整齐; 27 7 zxjr 28 7 tian // ******************************* 案例 二 ********************************** ''' 显示 passwd 中用户 ID 大于100 的行号和用户名 (使用 if ... else ...)''' awk -F ":" '{if ($3>100) print NR" "$1}' passwd ... ... 27 zxjr 28 tian // ******************************* 案例 三 ********************************** ''' 在服务器 log 中找出 'Error' 的发生日期''' sed -n '/Error/p' /var/log/messages |awk '{print $1,$2,$3}' // 方法一; awk '/Error/ {print $1,$2,$3}' /var/log/messages // 方法二;
awk 逻辑判断spa
// 匹配 $1 是以 t 开头的行; awk -F ":" '$1~/^t.*/ {print $1}' passwd tian // 匹配 $1 不以 t 开头的行; awk -F ":" '$1!~/^t.*/ {print $1}' passwd root ... ... // 判断 UUID 大于 500 的输出用户名; awk -F ":" '$3>500 {print $1}' passwd zxjr tian // 判断 UUID 等于 502 的输出用户名; awk -F ":" '$3==502 {print $1}' passwd tian
awk -- 扩展格式命令行
// 制表显示 passwd 每行的行号, 每行的列数, 对应行的用户名 awk -F ":" 'BEGIN{print "Line Col User"}{print NR" "NF" "$1}END{print "------"FILENAME"------"}' passwd Line Col User 1 7 root 2 7 bin ... ... 10 7 uucp ... ... ------passwd------ // 比较美观的写法; awk -F ":" 'BEGIN{print "Line Col User"}{printf("%2s%10s%s%s\n",NR,NF," ",$1)}END{print "------"FILENAME"------"}' passwd ... ... Line Col User 1 7 root 2 7 bin ... ... 10 7 uucp ... ... ------passwd------
awk -- 案例code
// ***************************** 案例 一 ******************************** ''' 统计当前文件夹下的 文件/文件夹 占用的大小 ''' // 定义 size 变量, size 累加文件及目录的大小, 打印总和; ls -l |awk 'BEGIN{size=0}{size+=$5}END{print " Size is: "size}' Size is: 1024038984 // 添加单位, 进行换算; ls -l |awk 'BEGIN{size=0} {size+=$5} END{print " Size is: "size/1024"M"}' Size is: 1.00004e+06M // ***************************** 案例 二 ******************************** ''' 统计显示 passwd 的帐户总人数 ( 要考虑空行的可能 ) ''' // 开始, 定义计数器, 匹配排除空行, 自加一, 结束, 打印总数; awk 'BEGIN{count=0} $1!~/^$/{count++} END{print " Totle: "count}' passwd Totle: 28 // ***************************** 案例 三 ******************************** ''' 统计显示 passwd 文件中 UUID 大于 100 的用户 ''' // 定义计数器, 判断 UUID 大于 100; 定义一个数组, 将值与用户对应, 使用 for 循环打印用户名; awk -F ":" 'BEGIN{count=0} {if ($3>100) name[count++]=$1} END{for (i=0;i<count;i++) print i,name[i]}' passwd 0 abrt 1 saslauth 2 nginx 3 zxjr 4 tian // ****************************** 案例 四 ******************************** ''' 统计 netstat -anp 状态下为 LISTEN 和 CONNECTED 的链接数量 ''' // 定义计数器, 判断状态行等于两种状态时, 计数器自加一, 打印总数; netstat -anp |awk 'BEGIN{count=0} {if ($6=="LISTEN"||$6=="CONNECTED") count++} END{print " Connect Totle: "count}' Connect Totle: 68 // 状态行匹配两种状态的其中一种,匹配到哪一种, 哪一种自加一, 使用 for 循环打印; netstat -anp |awk '$6~/CONNECTED|LISTEN/ {sum[$6]++} END{for (i in sum) print " ",i,sum[i]}' CONNECTED 64 LISTEN 4
awk 总结