CentOS7 运维 - awk工作原理 | 实例操作

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}'

猜你喜欢

转载自blog.csdn.net/qq_42427971/article/details/114844808