用法
awk "BEGIN { statements } 条件1 { statements } 条件2 { statements } ... END { end statements }"
-F,指定分隔符,后面跟单引号
awk的工作模式:
- 执行begin语句块中的语句
- 从文件或标准输入中读取一行,判断是否符合条件,若符合执行括号中的语句,重复这个过程,直到文件到达末尾
- 最后执行end语句块
awk中的特殊变量:
变量 | 描述 |
---|---|
NR | 执行过程中对应的行号 |
NF | 执行过程中当前行的字段数 |
FS | 分隔字符,默认为空格 |
OFS | 定义输出分隔符 |
$0 | 执行过程中当前行的文本内容 |
$n | 第n个字段的文本内容,n为1,2,3… |
实例
#打印每行分隔的第一个字段,以及每行的行数和字段数
[root@mdw ~]# last | awk '{print $1 "\t lines: " NR "\t columes: " NF}'
root lines: 1 columes: 10
root lines: 2 columes: 10
root lines: 3 columes: 10
...
#设置分隔符为冒号,若第三个字段小于10,就打印出该行第一个字段和第3个字段,begin可以省略
[root@mdw ~]# cat /etc/passwd|awk '{FS=":"} $3 < 10 {print $1 "\t " $3} '
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
...
[root@mdw ~]# cat /etc/passwd|awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3} '
root 0
bin 1
daemon 2
...
练习题
- 用awk打印整个test.txt文档
awk '{print $0}' test.txt
- 查找所有包含bash的行
awk /bash/ test.txt
- 用·:作为分隔符,查找第3个字段等于0的行
awk -F ':' '$3==0' test.txt
- 用·:作为分隔符,查找第1个字段为root的行,并把root换成toor
awk -F ':' '$1=="root"' test.txt | sed -n 's/root/toor/g'p
- 用·:作为分隔符,打印最后一个字段
awk -F ':' '{print $NF}' test.txt
- 打印行数大于20的所有行
awk -F ':' '$NR>20' test.txt
- 用·:作为分隔符,打印所有第3个字段小于第4个字段的行
awk -F ':' '$3<$4' test.txt
- 用·:作为分隔符,打印第一个字段以及最后一个字段,并且中间用@连接
awk -F ':' '{print $1 "@" $NF}' test.txt
- 用·:作为分隔符,把整个文档的第4个字段相加,求和
awk -F ':' '{(sum+=$4)}; END {print sum}' test.txt