awk主要用于处理有格式的文本,例如/etc/passwd这种
用法
- awk 选项 'pattern{action}' 文件路径
选项
- -F指定分隔符 -- 如(-F:)
工作流程
- awk -F: '{print $1,$3}' /etc/passwd
- awk会读取文件的一行内容然后赋值给$0
- 然后awk会以-F指定的分隔符将该行切分成n段,最多可以达到100段,第一段给$1,第二段给$2,依次次类推
- print输出该行的第一段和第三段,逗号代表输出分隔符,默认与-F保持一致
- 重复步骤1,2,3直到文件内容读完
内置变量
- $0 -- 一整行内容
- NR -- 记录号,等同于行号
- NF -- 以-F分隔符分隔的段数
pattern可以是
- /正则/ # 该行内容匹配成功正则
- $1 ~ /正则/ # 第一段内容匹配成功正则
- $1 !~ /正则/ # 第一段内容没有匹配成功正则
- 比较运算
- NR >= 3 && NR <=5 # 3到5行
- $1 == "root" # 第一段内容等于root
action可以是
- print $1,$3
数据
[root@wotdd home]# cat 2
root:x:0:0:root:/root:/bin/bash
1 2 3 4 5 6 7 以 : 可分成7段
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
EOF
- 正则匹配
- awk -F: '/^root/{print $1,$3} 2 -- 以 : 分隔,匹配以root开头,打印1和3段
- awk -F: '$1 ~ /^d/{print $1,$3}' 2 -- 以d开头,匹配第一段,打印1和3段
- awk -F: '$1 !~ /^d/{print $1,$3}' 2 -- 不是以d开头的,打印1和3段
- 比较运算
- awk -F: 'NR>3{print $1}' 2 -- NR 行号 大于3 行以上的
- awk -F: '$1 == "lp"{print $0}' 2 -- 运算 ,第一段 等于 指定字符 , $0 打印全部
- cat 2 | awk -F: '{print $1}' -- awk支持管道操作