awk案例练习100例
- 001 awk功能简介
- 002 输出文件中的内容
- 003 搜索pwd.txt 有root关键字的所有行
- 004 以冒号:为分隔符,搜索pwd.txt 有root关键字的行中的第七列。
- 005三级目录,
- 006 使用printf 来实现基本参数的输出
- 007 使用printf来实现输出
- 008 awk中BEGINH和END的基础使用方法
- 009 查找带有指定字符串的行
- 010 处理统计nginx 日志文件access.log中ip地址出现的次数。
- 011 awk中定义变量并赋值,统计读取的a.txt文件中内容,并统计行数,将值赋给count变量
- 012 统计某个文件夹下的文件占用的字节数
- 013 在awk中使用if判断条件过滤掉size=2563的数字,得到最终的size累加和
- awk中的条件语句
- 014 awk中的循环语句
- 015 awk中的数组
- 016 使用awk将$1获取的值都存储到name命名的数组中,然后使用for循环将数组中的值,按照下标一次进行输出
- 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三级目录
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