linux-awk-案例100例

awk案例练习100例


awk功能简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件 逐行的读入, 以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法   : awk '{pattern + action}' {filenames}

其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。
花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
完整的awk脚本通常用来格式化文本文件中的信息。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

001 awk功能简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

002 输出文件中的内容

[root@hdp0 awk]# cat a.txt 
aaa aaa bbb
ccc ddd eee
fff fff abc
abc abc abc

1.输出整个文件的内容

[root@hdp0 awk]# awk '{print $0}' a.txt 

#2.输出整个文件中第三列的内容

[root@hdp0 awk]# awk '{print $3}' a.txt  
bbb
eee
abc
abc

003 搜索pwd.txt 有root关键字的所有行

[root@hdp0 awk]# awk '/root/' pwd.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

004 以冒号:为分隔符,搜索pwd.txt 有root关键字的行中的第七列。

[root@hdp0 awk]# awk -F: '/root/ {print $7}' pwd.txt  
/bin/bash
/sbin/nologin

005三级目录,

[root@hdp0 awk]# awk -F: '{print "filename: "FILENAME",lineNumber: "NR",columns: "NF ",linecontent:"$0}' pwd.txt 
filename: pwd.txt,lineNumber: 1,columns: 7,linecontent:root:x:0:0:root:/root:/bin/bash
filename: pwd.txt,lineNumber: 2,columns: 7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin

006 使用printf 来实现基本参数的输出

[root@hdp0 awk]#  printf "%s--\n" a b c d e      #将每一个要输出的变量都用--和换行符进行输出。
a--
b--
c--
d--
e--
[root@hdp0 awk]# awk 'BEGIN{printf "%s\n",1,2,3,4}' # 输出第一个字符串 1
1
[root@hdp0 awk]# awk 'BEGIN{printf "%d\n%d\n%d\n%d\n",1,2,3,4}'
1
2
3
4
[root@hdp0 awk]# awk '{print}' a.txt 
aaa aaa bbb
ccc ddd eee
fff fff abc
abc abc abc
[root@hdp0 awk]#  awk '{printf "第一列:%s  第二列: %s 第三列: %s\n",$1,$2,$3}' a.txt 
# 输出要处理的文件a.txt每一行以空格符分开的前三个变量。
第一列:aaa  第二列: aaa 第三列: bbb
第一列:ccc  第二列: ddd 第三列: eee
第一列:fff  第二列: fff 第三列: abc
第一列:abc  第二列: abc 第三列: abc

007 使用printf来实现输出

[root@hdp0 awk]# awk -F: 'BEGIN{printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t\n","用户名","密码","UID","GID","用户注释","用户家目录","用户使用解释器"}{printf  "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t\n",$1,$2,$3,$4,$5,$6,$7}' pwd.txt 

在这里插入图片描述

008 awk中BEGINH和END的基础使用方法

 awk 'BEGIN{print "处理文本之前,awk执行了这个动作~~~~~~"}{print $0}END{print "所有文本处理完毕,执行了END模式"}' a.txt

在这里插入图片描述

009 查找带有指定字符串的行

grep "/sbin/nologin" pwd.txt 
awk '/\/sbin\/nologin/{print $0}' pwd.txt

010 处理统计nginx 日志文件access.log中ip地址出现的次数。

 cat access.log  
 awk '{print $1}' access.log 
 awk '{print $1}' access.log | sort -n # 排序
 awk '{print $1}' access.log | sort -n | uniq # 去重
 awk '{print $1}' access.log | sort -n | uniq | wc -l # 统计各个ip访问(出现)的次数
 awk '{print $1}' access.log | sort -n | uniq -c #uniq -c 显示输出中,在每行行首加上本行在文件中出现的次数。
 awk '{print $1}' access.log | sort -n | uniq -c | sort -n 
 awk '{print $1}' access.log | sort -n | uniq -c | sort -nr |  
 awk '{print $1}' access.log | sort -n | uniq -c | sort -nr |  head -1
 #sort    sort -r将数字当做字符进行排序
 #sort -n  sort -nr 按照整个数字来排序

011 awk中定义变量并赋值,统计读取的a.txt文件中内容,并统计行数,将值赋给count变量

[root@hdp0 awk]# awk 'BEGIN{count=0;print "[start]user count is ",count}{count=count+1;print $0}END{print "[end] user count is:",count}' a.txt
[start]user count is  0
aaa aaa bbb
ccc ddd eee
fff fff abc
abc abc abc
[end] user count is: 4

012 统计某个文件夹下的文件占用的字节数

在这里插入图片描述

[root@hdp0 awk]# ls -l
总用量 12
-rw-r--r-- 1 root root  565 1月  24 23:03 access.log
-rw-r--r-- 1 root root   48 1月  18 16:29 a.txt
-rw-r--r-- 1 root root 2563 1月  18 17:15 pwd.txt
[root@hdp0 awk]# ls -l | awk 'BEGIN{size=0;}{size=size+$5;}END{print "[end] size is:",size}'
[end] size is: 3176  #  565+48+2563

013 在awk中使用if判断条件过滤掉size=2563的数字,得到最终的size累加和

[root@hdp0 awk]# ls -l
总用量 12
-rw-r--r-- 1 root root  565 1月  24 23:03 access.log
-rw-r--r-- 1 root root   48 1月  18 16:29 a.txt
-rw-r--r-- 1 root root 2563 1月  18 17:15 pwd.txt
[root@hdp0 awk]# ls -l | awk 'BEGIN{size=0;print "[start]size is",size}{if($5!=2563){size=size+$5;}}END{print "[end] size is ",size/1024,"K"}'    
[start]size is 0
[end] size is  0.598633 K

awk中的条件语句

awk中的条件语句是从C语言中借鉴来的,见如下声明方式:

if (expression) {
    statement;
    statement;
    ... ...
}

if (expression) {
    statement;
} else {
    statement2;
}

if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}

014 awk中的循环语句

awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

015 awk中的数组

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等

016 使用awk将$1获取的值都存储到name命名的数组中,然后使用for循环将数组中的值,按照下标一次进行输出

[root@hdp0 awk]# head -n 10 pwd.txt| awk -F: 'BEGIN{count=0;}{name[count]=$1;count++;};END{for(i=0;i<NR;i++)print i,name[i]}'
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
6 shutdown
7 halt
8 mail
9 operator

017三级目录

018三级目录

019三级目录

020三级目录

021三级目录

022三级目录

023三级目录

024三级目录

025三级目录

026三级目录

027三级目录

028三级目录

029三级目录

030三级目录

031三级目录

032三级目录

033三级目录

034三级目录

035三级目录

036三级目录

037三级目录

038三级目录

039三级目录

040三级目录

041三级目录

042三级目录

043三级目录

044三级目录

045三级目录

046三级目录

047三级目录

048三级目录

049三级目录

050三级目录

051三级目录

052三级目录

053三级目录

054三级目录

055三级目录

056三级目录

057三级目录

058三级目录

059三级目录

060三级目录

061三级目录

062三级目录

063三级目录

064三级目录

065三级目录

066三级目录

067三级目录

068三级目录

069三级目录

070三级目录

071三级目录

072三级目录

073三级目录

074三级目录

075三级目录

076三级目录

077三级目录

078三级目录

079三级目录

080三级目录

081三级目录

082三级目录

083三级目录

084三级目录

085三级目录

086三级目录

087三级目录

088三级目录

089三级目录

090三级目录

091三级目录

092三级目录

093三级目录

094三级目录

095三级目录

096三级目录

097三级目录

098三级目录

099三级目录

100三级目录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值