Linux命令awk

时间:2021-12-24 18:20:26

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

2.使用方法

awk '{pattern + action}' {filenames}

其中 pattern 表示 awk 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。

花括号 {} 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
pattern就是要表示的正则表达式,用斜杠括起来。

  • awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息
  • awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息
  • 通常,awk是以文件的一行为处理单位的,awk每接收文件的一行,然后执行相应的命令,来处理文本。

3.调用awk
3.1.命令行方式

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
  在awk中,文件的每一行,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

3.2.将所有的awk命令插入一个单独文件,然后调用:

awk -f awk-script-file input-file(s)

  其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。   
4.入门实例 
 需求:只显示 /etc/passwd 的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加 "blue,/bin/nosh"。

#cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
  name,shell
root,/bin/bash
daemon,/bin/sh
....
blue,/bin/nosh
  • 先执行BEGIN,然后读入有 /n 换行符分割的一条记录,然后将记录按指定的域分隔符划分域。
  • -F指定域分隔符为':',默认域分隔符是"空白键" 或 "[tab]键"
  • 填充域,$0 表示所有域,$1表示第一个域,$n表示第n个域,
  • 随后开始执行模式所对应的动作 action 即{print $1","$7}。
  • 接着开始读入第二条记录······
  • 直到所有的记录都读完,最后执行END操作。

需求:搜索/etc/passwd有 root 关键字的所有行,并显示对应的shell

# awk -F: '/root/{print $7}' /etc/passwd 

/bin/bash
 其中, /root/ 中的 root 是awk的pattern(匹配包含root的行),表示要查找的数据。awk中的action是{print $7}