awk是一个比较倾向于处理一行当中多个字段处理与显示,它的语法大致如下:
# awk [-fF] '条件类型1{动作1} 条件类型2{动作2}' filename
- -f : 指定awk解析脚本,相当于把上述的“条件类型”与“动作”写入到脚本当中;
- -F :指定分割符号,默认为【空格】,相当于FS,下面会说到;
特殊变量:
变量名称 | 代表意义 |
NF | 每行所拥有的字段总数,有可能会看到$NF其代表显示最后一个字段的数据。 |
NR | 当前awk所处理的【第几行】数据 |
FS | 分割字符,默认为【空格】键;也可通过-F 设定 |
OFS | awk输出(print)时在一行当中,每个字段之间所设定的分隔符,默认为【空格键】。 |
ORS | awk输出(print)时行与行之间所设定的分隔符,默认为【\n】。 |
特殊区域块:
定义方式 | 代表意义 |
BEGIN{} | 初始化区域块,其作用为在执行动作前先执行BEGIN{}区域的内容 |
END{} | 其作用为当整个awk执行完动作后,最后所执行的END{}区域内容 |
范例一:显示/etc/passwd中的用户名
# awk -F ":" '{print $1}' /etc/passwd
在/etc/passwd的数据当中,每行的数据是以“:”来分割,而不是默认的【空格】键,所以这块需要对其进行指定。
'{}' 其动作固定写法,这里必须是单引号。而$1代表着第一个字段。
范例二:仅显示/etc/passwd中第1,3行的数据。并行于行之间空两行显示,其段段之间的分隔符为“-”,显示用户名、GID和最后一个字段
awk 'BEGIN{FS=":";OFS="-";ORS="\n\n"} NR == 2 || NR == 3 {print $1,$3,$NF}' /etc/passwd
这里唯一需要特殊说下的是“$NF”,其意思为最后的字段。
范例三:显示/etc/passwd数据中,其用户名、当前行数、总字段数
awk -F ":" '{printf "%10s lines:%4d columes:%4d \n", $1, NR, NF}' /etc/passwd
范例四:显示当前用户使用次数最多的前10个命令
awk '{++a[$1]}END{for(i in a)print i, a[i] | "sort -k2 -rn"}' ~/.bash_history | head
范例五:利用awk执行shell命令
echo "/usr/local/bak_1;/usr/local/bak_2;/usr/local/bak_3" | awk -F ";" '{mkdir="mkdir "$1;system(mkdir)}'