一、awk的内置参数

$0:表示整个当前行

$1:每行第一个字段

$2:每行第二个字段

$n:每行第n个字段

awk的参数:分隔符

  -F separator 设定分隔符(默认为空格)  

打印单个字段:

awk -F ':' '{print $3}'   /etc/passwd

打印多个字段:

awk -F ':' '{print $1,$3}'  /etc/passwd

awk -F ':' '{printf("User:%s      UID:%s\n", $1,$3)}'  /etc/passwd

awk -F ':' '{print "User:" $1 "\t"UID:"$3"}'  /etc/passwd

  NR:每行行号

  NF:字段数量

awk -F ':' '{print NR,NF,FILENAME}' /ect/passwd

#案例:

1、显示/etc/passwd 中用户名ID大于100的行号和用户名

awk -F ":" '{if ($3>100) print NR,$1}' /etc/passwd

awk -F ":" '$3>100{print NR,$1}' /etc/passwd

2、在服务器的日志中找出IP:43.226.164.120 的访问日期。

sed -n '/43.226.164.120/p' assess_log | awk ' ' '{print substr($4,2)}'

awk '/43.226.164.120/{print substr($4,2)}' assess_log

二、awk的逻辑判断式:

  • ~     匹配正则表达式
  • !~ 不匹配正则表达式
  • ==等于
  • !=不等于
  • < 小于
  • >大于

awk -F ':' '$1~/^m.*{print $1}' /etc/passwd   打印以m开头的用户名

awk -F ':' '$1!~/^m.*{print $1}' /etc/passwd  不打印以m开头的用户名

三、awk的扩展格式

command扩展

BEGIN{print "start"}pattern{awk命令}END{print "end"}

#案例:制表显示/etc/passwd 每行的行号,每行的列数,对应行的用户名

awk -F ':' 'BEGIN {"User     Line    Col"}{print $1,NR,NF}END{print  "-------------"FILENAME"-------------"}'  /etc/passwd

#案例:统计当前文件夹下的文件/文件夹占用的大小

ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count}'

ls -al | awk 'BEGIN{count=0}{count+=$5}END{print count/1024/1024"M"}'

#统计显示/etc/passwd的账户总人数

awk -F ':'  'BEGIN{count=0}{count++}END{print count}' /etc/passwd

awk -F ':'  'BEGIN{count=0}$1!~/^$/{count++}END{print count}' /etc/passwd 排除空行

#统计显示/etc/passwd中UID中大于100的用户名

awk -F ':'  '$3>100{print $1}'  /etc/passwd

awk -F ':' 'BEGIN{count=0}$3>100{user[count++]=$1}END{for(i=0;i<count;i++) print i,user[i]}'  /etc/passwd

#统计access_log日志中每个IP出现的次数

awk '{arr[$1]++}END{for(key in arr)print key,arr[key]}'  access_log

awk和sed对比

1、awk和sed都可以处理文本

2、awk侧重于复杂逻辑处理

3、sed侧重于正则处理

4、awk和sed可以共同使用

面试问题

1、修改某个目录下所有包含AAA的文件的文件名  改为 aaa【改文件名】

find . -name "*aaa*"  -exec rename aaa AAA  { } \;

2、修改目录下所有的文件中,包含 aaa 都改成 AAA【改文件内容】

sed -i  's/AAA/aaa/g' `grep AAA -rl . `  反引号

sed本身不改变文件内容,要使用-i,然后看下文件

最新文章

  1. Android中Intent的用法总结
  2. 关于【error C3646: 未知重写说明符】的若干种可能性
  3. #ifdef 和 #if defined 的区别 -- 转
  4. Linux下双网卡绑定(bonding技术)
  5. BitSet
  6. ceph rpm foor rhel6
  7. JSTL分割字符 fn:split()
  8. Liferay的架构:缓存(第一部分)
  9. MySQL查看索引、表信息、触发器
  10. Java高级开发工程师面试——多线程
  11. Hibernate-ORM:05.Hibernate中的list()和iterator()
  12. SpringCloud系列——SSO 单点登录
  13. C++枚举类型Enum及C++11强枚举类型用法
  14. Part-Nine
  15. java SPI &amp; spring factories
  16. php上传多张图片
  17. day27 多继承 super 详细用法
  18. POJ - 1942 D - Paths on a Grid
  19. [Apio2008]免费道路[Kruscal]
  20. 问题记录 | VScode中使用IntelliJ的快捷键

热门文章

  1. 洛谷P1290 欧几里德的游戏
  2. Spring注解的(List&amp;Map)特殊注入功能
  3. 《SONG FROM PI: A MUSICALLY PLAUSIBLE NETWORK FOR POP MUSIC GENERATION》论文笔记
  4. 【旧文章搬运】分析了一下360安全卫士的HOOK
  5. GC 和 Full GC 有什么区别?
  6. UVA1328 Period【KMP/周期串/循环节】By cellur925
  7. Graph HDU - 4467
  8. The Specials Menu LightOJ - 1025
  9. Codeforces Round #324 (Div. 2)
  10. Vue-cli构建项目, 组件中js代码引入图片路径问题