概述
AWK 是 Linux 中常用的命令,有 GAWK、NAWK和 OAWK 之分,一般 Linux 发行版都使用 GAWK。
AWK 是以行为单位处理文本的,默认使用 空格 或 \t 作为分隔符分组一行,将对应的字段填入指定的变量。命令的形式为:
awk '条件{执行语句} 条件{执行语句}' filename
输入来源有两种
- 命令指定的文件
- 管道的输出
多条条件之间是独立的,会一一匹配条件,条件满足则执行响应的执行语句
内置变量
- $0 代表一整行
- $N 代表第 N 个字段
- NF 每一行拥有的 字段 数量
- NR 当前所处的行数
- FS 目前的分割字符,默认为空格键或 Tab 键
- OFS 输出的字段分割符号,默认为空格
- RS 记录分割符,默认为换行符
- ORS 输出的记录分割符,默认为换行符
- FILENAME 当前输入文件的名字
使用条件和执行语句的例子:
awk '{FS=":"} $3<100{print $1 "\t" $3}' /etc/passwd
输出是:
第一行就生效
第一行没有生效,要让第一行生效需要使用关键字 BEGIN
awk 'BEGIN {FS=":"} $3<100{print $1 "\t" $3}' /etc/passwd
多条命令
awk 'BEGIN {FS=":"} {print $1; print $2}' /etc/passwd
命令括号中可以存在多条命令,但是他们要用 “;” 号隔开,或者通过换行自然分割也行。
字符串匹配
其实 AWK 可以用来替换 grep,例如,我们普通用的 grep:
如果改成 awk 的话,那么就可以变成:
这样就没 grep 什么事了,什么?grep -v
很好用?试试这一句:
awk '! /root/ { print $1}' /etc/passwd
字段过滤
刚才演示的例子只能过滤一行,然而,我们可以做得更多,我们可以只过滤用户名:
awk 'BEGIN {FS=":"} $1 ~ /root/{print $1}' /etc/passwd
BEGIN 和 END
- BEGIN { 后续命令执行前的操作 }
- END { 后续命令执行后的操作 }
环境变量
可以在 AWK 中使用环境变量,方式为变量 ENVIRON
,传入的方式可以是 export 环境变量,也可以是在调用 awk 的时候传递 -v 参数
$ awk -v val=$x '{print $1, $2, $3, val, ENVIRON["ts"]}' OFS="\t" /etc/passwd