awk 报告生成器

awk 处理机制

  • AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )
  • awk 会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作 ,在命令格式上分别体现如下:

BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}: 逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{}: 处理完最后一行文本之后执行,一般用来输出处理结果

awk 基本用法

在awk中,= 赋值 == 判断,这点跟C语言中很相似。
$0 表示整行
linux 上面默认使用 gawk

基本用法总结
awk '{print FILENAME}' passwd
awk '{print 第 "NR" 行 , 有 "NF" 列 }'
awk 'BEGIN{print NAME}'
awk 'END{print WESTOS}'
awk -F : 'BEGIN{print NAME}{print $1}END{WESTOS}'
awk '/bash$/'
awk -F : '/bash$/{print $1}'

awk 'BEGIN{a=34;print a+12}'
awk -F : '/^ro/{print}' /etc/passwd
awk -F : '/^[a-d]/{print $1,$6}' passwd.txt
awk -F : '/^a|nologin$/{print $1,$7}' passwd.txt
awk -F : '$6~/bin$/{print $1,$6}'
awk -F : '$7!~/nologin$/{print $1,$7}' passwd.txt
举例:

在这里插入图片描述

awk -F : '{print $0}' passwd   显示所有列

在这里插入图片描述

awk -F : '{print $1}' passwd   显示第一列

在这里插入图片描述

awk -F : '{print $2}' passwd   显示第二列

在这里插入图片描述

awk -F : 'BEGIN{print "hello"}{print $1}' passwd  以hello开头,显示第一列

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print $1,n}' passwd  显示第一列,在第一列后显示1

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print $1,n++}' passwd  n++

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print n++,$1}' passwd   在第一列前显示

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print n++,$1}END{print "over"}' passwd 在第一列前显示,并在最后显示over

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print n++,$1}END{print NR}' passwd  在最后统计所有行数

在这里插入图片描述

awk -F : 'BEGIN{n=1}{print n++,$1}END{print NF}' passwd  统计所有列数

在这里插入图片描述

awk '/bash/{print}' passwd    有bash的行
awk -F : '/bash/{print $1}' passwd   有bash的第一列

在这里插入图片描述

awk -F : 'NR==3{print $1}' passwd  第三行,第一列
awk -F : 'NR==3{print}' passwd  第三行
awk -F : 'NR==3{print $0}' passwd

在这里插入图片描述

awk -F : 'NR>=3&&NR<=6{print}' passwd 第3-6行
awk -F : 'NR>=3&&NR<=6{print $0}' passwd  3-6行第一列
awk -F : 'NR>=3&&NR<=6{print $1}' passwd  3-6行第一列

在这里插入图片描述

awk -F : 'NR==4||NR==6{print}' passwd  第4和第6

在这里插入图片描述

awk '{print FILENAME}' passwd   打印文件名,有多少行就打印多少个

在这里插入图片描述

awk '/bash$/' passwd 
awk -F : '/bash$/{print $1}' passwd

在这里插入图片描述

练习题
  • 统计/etc/passwd文件中交互式登陆的用户的个数,即最后一列是以nologin结尾的。
我写的:
awk -F : 'BEGIN{n=1}/nologin$/{print n++}' passwd

老师的:
awk 'BEGIN{N=0}/nologin$/{N++}END{print N}' /etc/passwd
从0开始计,因为从1开始要-1

在这里插入图片描述

举例
awk 'BEGIN{a=34;print a+12}'  结果是46
awk '/^[a-d]/{print}' /etc/passwd  以a-d开头的行

在这里插入图片描述

awk '/^[^a-d]/{print}' /etc/passwd  不是以a-d开头的行,第一个^  任意 第二个^  除了

在这里插入图片描述

awk '/^r|bash$/{print}' /etc/passwd   以r开头或bash结尾的行

在这里插入图片描述

awk '/^r/&&/bash$/{print}' /etc/passwd   且
awk '/^r/||/bash$/{print}' /etc/passwd  或

在这里插入图片描述

awk -F : '$6~/bin$/{print}' /etc/passwd   第6列以bin结尾的行 贪婪模式,sbin也会过滤    第6列内容是bin

在这里插入图片描述

awk -F : '$6!~/bin$/{print}' /etc/passwd  第6列不以bin结尾的行

在这里插入图片描述

awk -F : '$6!~/\<bin$/{print}' /etc/passwd  第6列不是bin的

在这里插入图片描述

练习题
  • 统计出/etc/passwd里家目录不在home下的,可登陆的系统的用户
我写的:只写了一个条件
awk -F : 'BEGIN{n=0}$6!~/^\/home/{print n++,$1,$6}' /etc/passwd

两个条件:家目录不在/home,可登陆系统
awk -F : '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
useradd -d /mnt/zhang zhang
因为shell本身就是最后一列,所以不用加$7
加也可以:
awk -F : '$6!~/^\/home/&&$7~/bash$/{print $1}' /etc/passwd

要统计个数的话:
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&$7~/bash$/{print $1;N++}END{print N}' /etc/passwd

在这里插入图片描述
在这里插入图片描述

练习题
  • 利用awk命令抓取ip,只显示ip。
我写的:
ifconfig lo | awk  '/inet/{print $2}'| head -n 1

老师的:
vim ip.sh  

#!/bin/bash
[ -z "$1" ] && {
        echo : "Error:Please input device name!"
        exit
}
ifconfig $1 &> /dev/null || {
        echo "$1 is not exist"
        exit
}
ifconfig $1 | awk '/inet\>/{print $2}'

awk的默认分隔符为空格

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值