Linux awk命令使用详解


简单介绍一下,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大,这是我们玩linux的必备基本功,若要对其身世有更详尽的了解,自行搜索即可。对于工具的知识,笔者尽量将每个知识点的简要说明,并给出实例。
 
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
 
用法:
awk [options] 'scripts' file1,file2...
awk [options] 'pattern {action}' file1,file2...
 
options是awk的支持的选项,譬如-F -v等; scripts是其处理脚本,包含模式pattern和动作action(模式和动作的关系一般为,模式负责确定有效字段,动作负责对其处理)
 
一、print的简单使用
 
创建一个简单的测试文件如下:

  1. [root@mos download]# cat demo.txt
  2. Welcome to mos blog.
  3. This is a test file.


例:打印整行: $0

  1. [root@mos download]# awk '{print $0}' demo.txt
  2. Welcome to mos blog.
  3. This is a test file.

例:打印每行的最后一个字段: $NF

  1. [root@mos download]# awk '{print $NF}' demo.txt
  2. blog.
  3. file.

例:打印第二个字段: $2

  1. [root@mos download]# awk '{print $2}' demo.txt
  2. to
  3. is

例:打印每行的倒数第二个字段,并在其后打印OK

  1. [root@mos download]# awk '{print $(NF-1),"OK"}' demo.txt
  2. mos OK
  3. test OK

例:打印行号

  1. [root@mos download]# awk '{print NR,$0}' demo.txt
  2. 1 Welcome to mos blog.
  3. 2 This is a test file.

例:打印当前系统环境变量的某个特定值,譬如路径,下面俩输出一样

  1. [root@mos download]# awk '{print ENVIRON["USER"];}' demo.txt
  2. root
  3. root
  4. [root@mos download]# awk 'BEGIN{print ENVIRON["PATH"];}'
  5. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  6. PS:后面的文件只是为了让print成功执行,BEGIN是执行前可以输出的数据,常用作写为报告标题和测试输出,其内容不能获得与文件修改操作有关的变量,后面会说到;

例:awk的默认分隔符为空格,而有些文本字以其他字符为分隔符,以下两例相同

  1. [root@mos download]# awk -F: {'print $1,$NF'} /etc/passwd|tail -1
  2. mos1 /bin/bash
  3. [root@mos download]# awk -v FS=: '{print $1,$NF}' /etc/passwd|head -1
  4. root /bin/bash

例:修改输出分隔符号,特殊字符需转义,如下几例:

  1. [root@mos download]# awk -v OFS=. '{print $1,$NF}' demo.txt
  2. Welcome.blog.
  3. This.file.
  4. [root@mos download]# awk -v OFS="~"'{print $1,$NF}' demo.txt
  5. Welcome~blog.
  6. This~file.
  7. [root@mos download]# awk -v OFS=\" '{print $1,$NF}' demo.txt
  8. Welcome"blog.
  9. This"file.
  10. [root@mos download]# awk -v OFS=9 '{print $1,$NF}' demo.txt
  11. Welcome9blog.
  12. This9file.
  13. [root@mos download]# awk -v OFS=XXXX '{print $1,$NF}' demo.txt
  14. WelcomeXXXXblog.
  15. ThisXXXXfile.
  16. PS: 若在print输出字段的之间不写逗号,则输出分隔符无效,输出的结果会直接连在一起

awk中有许多默认的变量,例如之前列出的:$1~$n、$0、FS、OFS等。下图为awk内置变量表:

  1. 属性 说明
  2. $0 当前记录(作为单个变量)
  3. $1~$n 当前记录的第n个字段,字段间由FS分隔
  4. FS 输入字段分隔符 默认是空格
  5. NF 当前记录中的字段个数,就是有多少列
  6. NR 已经读出的记录数,就是行号,从1开始
  7. RS 输入的记录他隔符默 认为换行符
  8. OFS 输出字段分隔符 默认也是空格
  9. ORS 输出的记录分隔符,默认为换行符
  10. ARGC 命令行参数个数
  11. ARGV 命令行参数数组
  12. FILENAME 当前输入文件的名字
  13. IGNORECASE 如果为真,则进行忽略大小写的匹配
  14. ARGIND 当前被处理文件的ARGV标志符
  15. CONVFMT 数字转换格式 %.6g
  16. ENVIRON UNIX环境变量
  17. ERRNO UNIX系统错误消息
  18. FIELDWIDTHS 输入字段宽度的空白分隔字符串
  19. FNR 当前记录数
  20. OFMT 数字的输出格式 %.6g
  21. RSTART 被匹配函数匹配的字符串首
  22. RLENGTH 被匹配函数匹配的字符串长度
  23. SUBSEP \034
  24. 声明一下:由于许多变量笔者亦不怎么常用,因此笔者此处未全部列出。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 下一页

相关内容