awk使用记录

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

例1:显示最近登录的5个账号

  1. 使用last -n 5 命令可以查看最近登录的5个账号的所有信息
yangkun  pts/2        60.118.118.118    Thu Jul  6 15:24   still logged in   
li4      pts/0        60.118.118.118    Thu Jul  6 14:42   still logged in   
zhangsan   pts/4        60.118.118.118    Thu Jul  6 12:34   still logged in   
zhangsan   pts/3        60.118.118.118    Thu Jul  6 11:01 - 14:13  (03:12)    
zhangsan   pts/3        60.118.118.118    Thu Jul  6 11:01 - 11:01  (00:00)   
  1. 使用awk命令截取用户名
last -n 5 | awk '{print $1}'

awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,
$0则表示所有域,$1表示第一个域,$n表示第n个域。
默认域分隔符是 "空格" 或 "tab键", 所以$1表示登录用户,$3表示登录ip,以此类推.




例2:以passwd文本为例,进行awk操作

  • passwd文件格式:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

http://blog.csdn.net/a1154490629/article/details/52190801
  1. 显示/etc/passwd中的账户
cat /etc/passwd | awk  -F ':'  '{print $1}'     //-F 指定域的分隔符为 ':'
  1. 显示账户和账户对应shell,以tab键分割
cat /etc/passwd | awk -F ':' '{print $1 "\t" $7}'
  1. 显示账户和账户对应shell,以逗号分割,并添加列名 name,shell 在最后一行添加 test,/bin/test
cat /etc/passwd | awk -F ':' 'BEGIN {print "name,shell"}  {print $1","$7} END {pritn "test,/bin/test"}'

awk工作流程是这样的:先执行BEGING,然后读取文件,
读入有/n换行符分割的一条记录,
然后将记录按指定的域分隔符划分域,填充域,
$0则表示所有域,$1表示第一个域,
$n表示第n个域,随后开始执行模式所对应的动作action。
接着开始读入第二条记录,直到所有的记录都读完,最后执行END操作。
  1. 搜索passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
  1. 搜索支持正则,查找以root开头,并输出对应的shell
awk -F ':' '/^root/{print $7}' /etc/passwd

这里指定了action{print $7}
  1. 统计passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
注: 这里的FILENAME,NR等为固定字符不可修改


使用printf替代print,可以让代码更加简洁,易读
awk  -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

posted @ 2017-07-06 15:27  0xcafedaddy  阅读(221)  评论(0编辑  收藏  举报