【shell】那些年学过的awk

127 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

awk

gawk (gnu awk)

Unix中awk的GNU版本,完成grep和sed的工作

支持数学运算,流程该控制内置大量的变量和函数

awk命令工作原理

与sed一样, 均是一行一行的读取、处理

sed作用于一整行的处理, 而awk将一行分成数个字段来处理

awk的用-F来指定分隔符

默认的字段分隔符是任意空白字符(空格或者TAB)

awk的数据字段变量

$0表示整行文本

$1表示文本中第一个数据字段

$2表示文本中第二个数据字段

$n表示文本中第n个数据字段

awk命令的执行过程

awk 命令的完整语法 : awk 'BEGIN{commands} pattern{commands} END{commands}' file1

  • 执行BEGIN{commands}语句块中的语句
  • 从文件或stdin中读取第1行,
  • 有无模式匹配, 若无则执行{}中的语句,
  • 若有则检查该整行与pattern是否匹配, 若匹配, 则执行{}中的语句,
  • 若不匹配则不执行{}中的语句,接着读取下一行
  • 重复这个过程, 直到所有行被读取完毕
  • 执行END{commands}语句块中的语句

awk命令的基本语法

awk -F 分隔符 '/模式{动作}' 输入文件

  • awk的指令一定要用单引号括起来
  • awk的动作一定要用花括号括起来
  • 模式可以是正则表达式、条件表达式或两种组合
  • 如果模式是正则表达式要用 / 定界符
  • 多个动作之间用; 分开

awk命令的操作符

  • 正则表达式和bash一致
  • 数学运算:+,-,*,/, %,++,- -
  • 逻辑关系符:&&, ||, !
  • 比较操作符:>,<,>=,!=,<=,== ~ !~
  • 文本数据表达式:== (精确匹配)
  • ~波浪号表示匹配后面的模式
  • 要想某个字段进行模式匹配,就需要使用~符号

使用格式:字段 ~ /模式/ 【demo】:

who | awk '$2 ~ /pts/{print $1}‘

awk -F: '$3 ~ /\<...\>/ {print $1,$3}' /etc/passwd

seq 100 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}'

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