W6-C3-0427

六周第三次课(4月27日)
9.6/9.7 awk
扩展
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html

语法

awk '{pattern + action}' {filenames}
由于模式和动作两者任一都可选,需要用大括号包围动作以区分于其他模式
用单引号包围防止解释$等字符, 也允许程序的长度超过一行
默认支持特殊字符

参数

  • -F 指定分隔符, 不指定则默认以空格或空白字符为分隔符
  • OFS: 指定print时用的分隔符. 先写OFS, 再写print.
    • 示例
      awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt
      awk -F ':' '{OFS="#"} {if($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
      head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3, $4}'
  • NR: 读取到的行数. Number of Record
  • NF: 字段数. Number of Fileds
  • $NF: 最后一个字段的值
    • 示例
      awk -F ':' '{print $1}' test.txt 打印passwd文件里行的第一段.
      awk '{print $0}' test.txt $0表示所有的段
      awk '{print $1,$3,$4}' test.txt 多要几段
      awk '{print $1"#"$3"#"$4}' test.txt分隔符用#号
      head -n3 /etc/passwd |awk -F ':' '{print NR}' 打印行号
      head -n3 /etc/passwd |awk -F ':' '{print NF}' 打印有多少段
      awk -F ':' 'NR<=10' test.txt 前10行. 可以作为判断条件.
      awk -F ':' 'NR<20 && $1 ~/roo/' /etc/passwd 也可以多个条件一起用
      awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
      awk -F ':' '{print $NR":"$NF}' test.txt 相当于$1:$7 $2:$7 $3:$7

两个字段相互比较

awk -F ':' '$3<$4' /etc/passwd
awk -F ':' '$3==$4' /etc/passwd
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd 并且
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd 或者
awk -F ':' '$3>1000 || $7 ~ /bash/' /etc/passwd
awk '{if(NR>=20 && NR<=30) print $1}' test.txt 打印第20-30行内容

条件判断

awk -F ':' '$3==0' test.txt
awk -F ':' '$3=="0"' test.txt 加双引号为字符串, 相当于sort 不加-n, 按asc码排序
awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt
awk -F ':' '{if ($1=="root") {print $0}}' test.txt
df | awk '$4>500000'
df -h | awk -F '[ %]+' '{print $5}'| grep -v Use 处理时可选择多个分隔符

匹配功能

awk '/oo/' test.txt 打印包含oo的行
awk -F ':' '$1 ~ /oo/' test.txt 只要第一段包含oo的行
awk -F ':' '$1 ~ /o+/' test.txt 只要第一段包含o的行
awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt 支持多个表达式一起写
awk -F ':' '/root|user/ {print $0}' test.txt
awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release
awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release

BEGIN模块

BEGIN 用于匹配第一个输入文件的第一行之前的位置
– 示例

BEGIN { print "Name    RATE    HOURS"; print ""} # print ""打印一个空行
{ print } #打印当前输入行

END模块

处理完输入文件中所有行后执行这个块。END块一般用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

示例

awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt 求和一列

awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' /etc/passwd

用awk查看服务器连接状态并汇总
netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'

未经允许不得转载:外贸SOHO笔记 » W6-C3-0427

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下作者~

支付宝扫一扫打赏

微信扫一扫打赏