使用方法

awk '{pattern + action}' {filenames}

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

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。



调用awk

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

[work@16-11-120 es-server]$ cat dd 
aaa bbb:ccc ddd eee fff:ggg
[work@16-11-120 es-server]$ cat dd |awk -F ':' '{print $1}'
aaa bbb
[work@16-11-120 es-server]$ cat dd |awk -F ':' '{print $1}' | awk '{print $2}'
bbb
[work@16-11-120 es-server]$ cat dd |awk '{print $1"\t"$3}'
aaa	ddd

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

试一下awk的使用

ls -lh | awk '{print $1}'

在这里awk 后面没有BEGIN和END,跟着的是pattern,也就是每一行都会经过这个命令,在awk中$n,表示第几列,在这里表示打印每一行的第一列。

  • $0 当前记录(这个变量中存放着整个行的内容)
  • $1~$n 当前记录的第n个字段,字段间由FS分隔
  • FS (Field Separator 字段分隔符)输入字段分隔符 默认是空格或Tab 
  • NF (Number of Field 字段个数)当前记录中的字段个数,就是有多少列
  • NR (Number of Record 记录数/行号 ) 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
  • FNR (File Number of Record 文件记录数)当前记录数,与NR不同的是,这个值会是各个文件自己的行号
  • RS  (Record Separator 记录分隔符)输入的记录分隔符, 默认为换行符
  • OFS 输出字段分隔符, 默认也是空格
  • ORS 输出的记录分隔符,默认为换行符
  • FILENAME 当前输入文件的名字