awk工作原理与实例
awk概述
通过逐行来读取文本,默认以空格或tab键
为分隔符进行分割将一行分为多个字段然后进行处理执行结果可以通过print
的功能将字段数据大印显示
命令格式
awk 选项 '模式或条件 [操作]' 文件1 文件2
awk -f 脚本文件 文件1 文件2
awk常见的内建变量
- FS 列分隔符,指定每行文本的字段分隔符,默认为空格或制表位
- NF 当前处理行的字段个数
- NR 当前处理行的行号
- $0 当前处理的行的整行内容
- $n 当前处理行的第n个字段
- FILENAME 被处理的文件名
- RS 行分隔符 awk充文件上读取资料时
- awk一次仅读入一条记录,以进行处理
实例
输出所有和内容
awk '{print $0}' file
输出1-3行内容
awk '(NR>=1)&&(NR<=3){print}' file
输出所有奇数行
awk 'NR%2==1{print}' file
输出所有奇数行
awk 'NR%2==0{print}' file
输出以 root 开头的行
awk '/^root/{print}' file
输出以 nologin 结尾的行
awk '/nologin$/{print}' file
BEGIN
模式是在处理指定文本之前,先执行BEGIN
模式中指定动作后awk
再处理指定的文本,最后执行END模式中的指定动作
awk 'BEGIN {x=0};/\/bin/\/bash/{print;x++};END {print x}' /etc/passwd
设定初始值为0检查/etc/passwd
中所有匹配/bin/bash/
,匹配x++
按字段输出文本
输出每行中的第三个字段
awk -F ":" '{print $3}' file
输出每行中的第1、3个字段
awk -F ":" '{print $1,$3}' file
输出第3个字段的值小于5的第1、3个字段内容
awk -F ":" '$3<5{print $1,$3}' file
输出第3个字段的值不小于200的行
awk -F “:” ‘!($3<200){print}’
输出第1个字段中包含root且又7个字段的行的第一二跟
awk -F ":" '($1~"1")&&(NF==3) {print $0}' file
awk -F ":" '($7!="bin/bash") && ($7!="/sbin/nologin"){print}' /etc/passwd
通过管道、双引号调用 Shell 命令
使用管道配合打印出PATH一共有多少行
echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'
awk -F ':' '/bash$/{print | "wc -l"}' /etc/passwd
查看当前内存的可用率
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'
free -m | awk '/NR==2 {print int($3/($3+$4)*100)"%"}'
top -bn 1
表示只输出一次
查看当前CPU的空闲率
top -bn 1 | awk -F, 'NR==3 {print $4}' | awk '{print $1}'
将ip地址分割为4段,然后每段通过for循环按照128 64 32从大到小来进行循环判断,然后存入数组中
显示上次系统重启时间
date -d "$(awk -F "."'{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"
w指令为当前登录的用户
调用w命令,并用来统计在线用户数
awk 'BEGIN{x=0; while ("w" | getline) n++; {print n-2}'
调用 hostname 获取当前主机名
awk 'BEGIN{"hostname" | getline; {print $0}}'
当getline左右无重定向符时,awk首先读取到了第一行,就是1,然后
seq 10 | awk '{getline; print $0}'
seq 10 | awk '{print $0; getline}'