一、awk命令简介

  awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

  awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

二、使用方法

2.1  格式

  1. awk '{pattern + action}' {filenames}
    awk [options] 'script' var=value file(s)
    awk [options] -f scriptfile var=value file(s)

  其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

2.2 常用命令选项

  • -F fs   fs 指定输入分隔符(可指定一个或多个),fs可以是字符串或正则表达式

  • -v var=value 赋值一个用户定义变量,将外部变量传递给awk

  • -f scriptfile 从脚本文件中读取awk命令

2.3 awk的内置变量

  1. $n : 当前记录的第n个字段,比如n1表示第一个字段,n2表示第二个字段。
  2. $ : 这个变量包含执行过程中当前行的文本内容。
  3. ARGC : 命令行参数的数目。
  4. ARGIND : 命令行中当前文件的位置(从0开始算)。
  5. ARGV : 包含命令行参数的数组。
  6. CONVFMT : 数字转换格式(默认值为%.6g)。
  7. ENVIRON : 环境变量关联数组。
  8. ERRNO : 最后一个系统错误的描述。
  9. FIELDWIDTHS : 字段宽度列表(用空格键分隔)。
  10. FILENAME : 当前输入文件的名。
  11. NR : 表示记录数,在执行过程中对应于当前的行号
  12. FNR : NR :,但相对于当前文件。
  13. FS : 字段分隔符(默认是任何空格)。
  14. IGNORECASE : 如果为真,则进行忽略大小写的匹配。如:IGNORECASE=1表示忽略大小写
  1. NF : 表示字段数,在执行过程中对应于当前的字段数。 print $NF打印一行中最后一个字段 OFMT : 数字的输出格式(默认值是%.6g)。 OFS : 输出字段分隔符(默认值是一个空格)。 ORS : 输出记录分隔符(默认值是一个换行符)。 RS : 记录分隔符(默认是一个换行符)。 RSTART : match函数所匹配的字符串的第一个位置。 RLENGTH : match函数所匹配的字符串的长度。 SUBSEP : 数组下标分隔符(默认值是34)。

2.4 运算符

2.5 正则表达式

三、案例

我们以passwd文件来操作。操作之前先备份好,使用备份的passwd文件操作

  1. [root@VM_0_10_centos shellScript]# awk -F ":" '{print $1}' /tmp/passwd
  2. root
  3. bin
  4. # 这里可以使用“,”将打印的多个条件分隔,打印的效果会自动有空格。如果使用的是$ $,里边是用空格,那打印出来的第一列和第3列会挨在一起
  5. [root@VM_0_10_centos shellScript]# awk -F ":" '{print $1,$3}' /tmp/passwd
  6. root
  7. bin
  8. [root@VM_0_10_centos shellScript]# awk -F ":" '{print $1 $3}' /tmp/passwd
  9. root0
  10. bin1

  11. [root@VM_0_10_centos shellScript]# awk -F ":" '{print $1 " " $3}' /tmp/passwd
  12. root
  13. bin
  14. # 使用制表符打印出信息
  15. [root@VM_0_10_centos shellScript]# awk -F ":" '{print "user:"$1 "\tuid:"$3}' /tmp/passwd
  16. user:root uid:
  17. user:bin uid:

1)只查看passwd文件(100内)第20到第30行内容。(面试)

  1. [root@VM_0_10_centos shellScript]# awk '{if(NR>=20 && NR<=30) print $1}' /tmp/passwd
  2. abrt:x::::/etc/abrt:/sbin/nologin
  3. sshd:x:::Privilege-separated
  4. postfix:x::::/var/spool/postfix:/sbin/nologin
  5. chrony:x::::/var/lib/chrony:/sbin/nologin
  6. tcpdump:x::::/:/sbin/nologin
  7. syslog:x::::/home/syslog:/bin/false
  8. mysql:x:::MySQL
  9. nagcmd:x::::/home/nagcmd:/sbin/nologin
  10. nagios:x::::/home/nagios:/sbin/nologin
  11. apache:x::::/home/apache:/bin/bash
  12. nginx:x:::Nginx
    # 不加$1打印20-30行所有内容
  13. [root@VM_0_10_centos shellScript]# awk '{if(NR>=20 && NR<=30) print}' /tmp/passwd
  14. abrt:x::::/etc/abrt:/sbin/nologin
  15. sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  16. postfix:x::::/var/spool/postfix:/sbin/nologin
  17. chrony:x::::/var/lib/chrony:/sbin/nologin
  18. tcpdump:x::::/:/sbin/nologin
  19. syslog:x::::/home/syslog:/bin/false
  20. mysql:x:::MySQL Server:/var/lib/mysql:/bin/false
  21. nagcmd:x::::/home/nagcmd:/sbin/nologin
  22. nagios:x::::/home/nagios:/sbin/nologin
  23. apache:x::::/home/apache:/bin/bash
  24. nginx:x:::Nginx web server:/var/lib/nginx:/sbin/nologin
  25. [root@VM_0_10_centos shellScript]# nl /tmp/passwd | awk '{if(NR>=20 && NR<=30) print}'
  26. abrt:x::::/etc/abrt:/sbin/nologin
  27. sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  28. postfix:x::::/var/spool/postfix:/sbin/nologin
  29. chrony:x::::/var/lib/chrony:/sbin/nologin
  30. tcpdump:x::::/:/sbin/nologin
  31. syslog:x::::/home/syslog:/bin/false
  32. mysql:x:::MySQL Server:/var/lib/mysql:/bin/false
  33. nagcmd:x::::/home/nagcmd:/sbin/nologin
  34. nagios:x::::/home/nagios:/sbin/nologin
  35. apache:x::::/home/apache:/bin/bash
  36. nginx:x:::Nginx web server:/var/lib/nginx:/sbin/nologin

2)已知text.txt文件内容,打印出Poe和33794712,并以 Poe 33794712格式显示

  1. [root@VM_0_10_centos shellScript]# cat test.txt
  2. I am Poe,my qq is
  1. # 使用多个分隔符,先使用空格分割,然后对分割结果再使用","分割
    [root@VM_0_10_centos shellScript]# awk -F "[ ,]" '{print $3,$7}' test.txt
  2. Poe

  3. [root@VM_0_10_centos shellScript]# awk -F '[ ,]+' '{print $3,$7}' test.txt
  4. Poe

3)awk -F  指定分割字符

  1. # -F 相当于内置变量FS
    [root@VM_0_10_centos shellScript]# awk 'BEGIN{FS=","} {print $1,$2}' test.txt
  2. this is a test
  3. Are you like awk
  4. This's a test
  5. There are orange apple

4)通过-v 设置变量

  1. [root@VM_0_10_centos shellScript]# cat test.txt
  2. I am Poe,my qq is
  3.  
  4. [root@VM_0_10_centos shellScript]# awk -vx= '{print $1,$1+x}' test.txt
  5. I
  6.  
  7. [root@VM_0_10_centos shellScript]# awk -vx= '{print $1,$(1+x)}' test.txt
  8. I
  9.  
  10. [root@VM_0_10_centos shellScript]# awk -vx= -vy=i '{print $1,$1+x,$1y}' test.txt
  11. I Ii
  12. 2i
  13. 7i

5)格式化输出

  1. # 8s代表8个space \n回车换行 %- 后面的-表示前面不空格,不加的话前面也会有8个空格
    # 因为这里是打印的$1和$4,所以前面格式输出的有两个值:%-8s和%-10s
  2. [root@VM_0_10_centos shellScript]# awk '{printf "%-8s %-10s\n",$1,$4}' test.txt
  3. I qq

6)过滤第一列大于2、等于2、第一列大于2且第2列等于'Are'

  1. [root@VM_0_10_centos shellScript]# awk '$1>2 {print $1,$3}' test.txt
  2. you
  3. This's test
  4. are
  5. # 需注意,这里不能使用单=号,会被认为是赋值。判断是否等于要使用双等号==
  6. [root@VM_0_10_centos shellScript]# awk '$1==2 {print $1,$3}' test.txt
  7. is
  8. [root@VM_0_10_centos shellScript]# awk '$1=2 {print $1,$3}' test.txt
  9. is
  10. you
  11. test
  12. are
  13. [root@VM_0_10_centos shellScript]# awk '$1>2 && $2=="Are" {print $1,$3}' test.txt
  14. you

7)内置参数用法

NF:字段数  NR:行号  FNR:文本行号(文件计数的行号)

FS:记录是以什么为分隔符  RS:默认分隔符(\n)  FILENAME:当前文件名  

OFS:输出记录分隔符(输出换行符),输出时用指定的符号代替换行符

ORS:输出记录分隔符(默认值是一个换行符)

  1. [root@VM_0_10_centos shellScript]# cat test.txt
  2. this is a test
  3. Are you like awk
  4. This's a test
  5. There are orange,apple,mongo
  6. [root@VM_0_10_centos shellScript]# awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS",
  7. "NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' test.txt
    FILENAME ARGC FNR FS NF NR OFS ORS RS
  8. ---------------------------------------------
  9. test.txt
  10. test.txt
  11. test.txt
  12. test.txt
  13. [root@VM_0_10_centos shellScript]# awk -F "," 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR"
  14. ,"FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' test.txt
    FILENAME ARGC FNR FS NF NR OFS ORS RS
  15. ---------------------------------------------
  16. test.txt ,
  17. test.txt ,
  18. test.txt ,
  19. test.txt ,

8)输出行号(行条数NR)及文件行号(FNR)

  1. # $0 在这里是打印文件所有内容
  2. [root@VM_0_10_centos shellScript]# awk '{print NR,FNR,$0}' test.txt
  3. this is a test
  4. Are you like awk
  5. This's a test
  6. There are orange,apple,mongo

9)输出指定的分隔符

  1. # 注意这里的$前后都加了空格,也可以不加空格,但是格式会比较紧凑
  2. [root@VM_0_10_centos shellScript]# awk '{print $1,$2,$5}' OFS=" $ " test.txt
  3. $ this $ test
  4. $ Are $ awk
  5. This's $ a $
  6. $ There $

10)使用正则,字符串匹配。匹配第2列包含“th”字符,并打印出第二列和第四列

~ 表示模式开始。// 中是模式。!~表示模式取反,不匹配搜索的行

  1. [root@VM_0_10_centos shellScript]# awk '$2 ~ /th/ {print $2,$4}' test.txt
  2. this a

四、awk脚本模式

  对于每个输入行, awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。

  因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
  awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

格式:

  • BEGIN{ 执行前的语句 }
  • END {处理完所有的行后要执行的语句 }
  • {处理每一行时要执行的语句}

案例:

1)通过脚本查看输出的效果

  1. [root@VM_0_10_centos shellScript]# cat score.txt
  2. Marry
  3. Jack
  4. Tom
  5. Mike
  6. Bob
  7. [root@VM_0_10_centos shellScript]# cat awk_score.awk
  8. #/bin/awk -f
  9. # 注意上面使用的bash
  10. # 运行前,输出名称
  11. BEGIN {
  12. Chinese =
  13. Math =
  14. English =
  15.  
  16. printf "NAME NO. Chinese Math English TOTAL\n"
  17. printf "-------------------------------------------------------------\n"
  18. }
  19. # 运行中
  20. {
  21. Chinese += $
  22. Math += $
  23. English += $
  24. printf "%-8s %-8s %6d %10d %10d %12d\n",$,$,$,$,$, $+$+$
  25. }
  26. # 运行后
  27. END {
  28. printf "-------------------------------------------------------------\n"
  29. printf " TOTAL:%16d %10d %10d \n",Chinese,Math,English
  30. printf "AVERAGE:%16.2f %10.2f %10.2f\n",Chinese/NR,Math/NR,English/NR
  31. }
  32. [root@VM_0_10_centos shellScript]# awk -f awk_score.awk score.txt
  33. NAME NO. Chinese Math English TOTAL
  34. -------------------------------------------------------------
  35. Marry
  36. Jack
  37. Tom
  38. Mike
  39. Bob
  40. -------------------------------------------------------------
  41. TOTAL:
  42. AVERAGE: 63.80 78.60 70.00

2)计算文件大小

  1. [root@VM_0_10_centos shellScript]# ls -l *.sh
  2. -rwxr-xr-x root root Oct : addUser.sh
  3. -rwxr-xr-x root root Oct : autoCreateUser.sh
  4. -rwxr-xr-x root root Oct : checkMem.sh
  5. -rwxr-xr-x root root Oct : checkRoot.sh
  6. -rwxr-xr-x root root Oct : createUsers.sh
  7. -rwxr-xr-x root root Oct : delUsers.sh
  8. -rwxr-xr-x root root Oct : modifyExtension.sh
  9. -rwxr-xr-x root root Oct : mulTable.sh
  10. -rwxr-xr-x root root Oct : numSort.sh
  11. -rwxr-xr-x root root Oct : progressBar2.sh
  12. -rwxr-xr-x root root Oct : progressBar.sh
  13. -rwxr-xr-x root root Oct : randowName.sh
  14. -rwxr-xr-x root root Oct : sum.sh
  15. -rwxr-xr-x root root Oct : test.sh
  16. [root@VM_0_10_centos shellScript]# ls -l *.sh | awk '{sum+=$5} END {print sum}'

3)打印九九乘法表

  1. [root@VM_0_10_centos shellScript]# seq | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i
  2. ==NR?"\n":"\t")}'
    1x1=
  3. 1x2= 2x2=
  4. 1x3= 2x3= 3x3=
  5. 1x4= 2x4= 3x4= 4x4=
  6. 1x5= 2x5= 3x5= 4x5= 5x5=
  7. 1x6= 2x6= 3x6= 4x6= 5x6= 6x6=
  8. 1x7= 2x7= 3x7= 4x7= 5x7= 6x7= 7x7=
  9. 1x8= 2x8= 3x8= 4x8= 5x8= 6x8= 7x8= 8x8=
  10. 1x9= 2x9= 3x9= 4x9= 5x9= 6x9= 7x9= 8x9= 9x9=

4)统计passwd账户人数

  1. [root@VM_0_10_centos shellScript]# awk '{count++;} END{print "USER Total:" count}' /tmp/passwd
  2. USER Total:
  3. [root@VM_0_10_centos shellScript]# awk 'BEGIN {COUNT=0;print "[start]:" COUNT} {COUNT++;} END{print "USER Total:" COUNT }'
  4. /tmp/passwd [start]:
  5. USER Total:
  6. [root@VM_0_10_centos shellScript]# awk 'BEGIN {COUNT=0;print "[start]:" COUNT} {COUNT+=1;} END{print "USER Total:" COUNT }'
  7. /tmp/passwd [start]:
  8. USER Total:

5)查询某个文件字节大小

  1. [root@VM_0_10_centos shellScript]# ll users.txt | awk 'BEGIN {SIZE=0} {SIZE=$5+SIZE} END {print "[end] SIZE:" SIZE}'
  2. [end] SIZE:

  3. [root@VM_0_10_centos shellScript]# ll numSort.sh | awk 'BEGIN {SIZE=0} {SIZE=$5+SIZE} END {print "[end] SIZE:" SIZE/1024/10
  4. ,"M"}'[end] SIZE:0.000804901 M

补充单位换算:

6)经典:查看服务器的连接状态

  1. [root@VM_0_10_centos shellScript]# netstat -an|awk '/^tcp/ {++s[$NF]} END{for(a in s)print a,s[a]}'
  2. LISTEN
  3. ESTABLISHED
  4. TIME_WAIT

7)查看日志访问情况

  1. awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]|"sort -rn -k1";print
  2. "total size is :"total}' /app/log/access_log

【文本处理命令】之awk命令详解的更多相关文章

  1. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  2. linux sed命令参数及用法详解

    linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...

  3. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  4. 【转】linux expr命令参数及用法详解

    在抓包过程中,查看某个设定时间内,数据上下行多少,用命令expr 计算! --------------------------------------------------------------- ...

  5. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

  6. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  7. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  8. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

    linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至:            linux dd命令使用详解 dd 的主要 ...

  9. (转)linux expr命令参数及用法详解

    linux expr命令参数及用法详解 原文:http://blog.csdn.net/tianmohust/article/details/7628694 expr用法 expr命令一般用于整数值, ...

  10. (转)Linux命令之Ethtool用法详解

    Linux命令之Ethtool用法详解 原文:http://www.linuxidc.com/Linux/2012-01/52669.htm Linux/Unix命令之Ethtool描述:Ethtoo ...

随机推荐

  1. 阻止保存要求重新创建表的更改-只需设置SQLServer的一个设置

  2. MySQL数据库~~~~~存储引擎

    1. InnoDB InnoDB引擎特点: 1.支持事务:支持4个事务隔离界别,支持多版本读. 2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响. 3.读写 ...

  3. hibernate opensission.createSQLquery 问题

    在进行分页查询的时候,通常会用到,页码,每页容量等等的参数进行操作,如下图: query.list()的时候会执行得到所需要的集合的值,在这个过程中, 如果使用自定义的返回参数,比如将日期做一些基本处 ...

  4. CSV和JSON格式相互转换

    1.为什么要进行CSV与JSON格式之间的转换 CSV格式常用于一二维数据表示和存储,他是一种纯文本形式存储表格数据的表示方式.JSON也可以表示一二维数据.在网络信息传输中,可能需要统一表示方式,因 ...

  5. Markdown数学公式语法

    详细网址:Markdown数学公式语法

  6. 01-linux介绍

    一.Linux简介 Linux内核最初只是由芬兰人林纳斯.托瓦兹在大学时出于爱好写出来的,是一套免费使用和自由传播的类Unix操作系统,是基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU ...

  7. vuex动态引入store modules

    主要解决的问题每次建一个module需要自己去主index.js里面去注册 为了偷懒,也为了避免团队开发时同时对index.js 进行修改引发冲突 所以在index.js中 动态的对子目录和模块进行注 ...

  8. 发布方式一:发布.netcore流程

    通过注册世纪互联,发布网站 注册需要上传身份证正反照片,以及打款一元,试用期一个月 https://www.azure.cn     注册完成后,进入主页面: 如图所示,创建完成后的效果: 点开详情, ...

  9. Access Editor Settings 访问编辑器设置

    This topic demonstrates how to access editors in a Detail View using a View Controller. This Control ...

  10. iOSMultipeerConnectivity使用

    MultipeerConnectivity是iOS7推出的多点连接框架,多用于文件传输,类似于iOS设备的airTrop隔空投放,在没有联网的情况下也能聊天传文件. 使用方法,一个设备作为广播开放Pe ...