文本处理三剑客之awk(报告生成器)

文本处理三剑客之awk(报告生成器)

awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。

awk在我认为简直就是文本处理时打劫放火一大利器。

例如取出/etc/passwd中的第一列。

[root@CentOS6 ~]# awk -F: ‘{print $1}‘ /etc/passwd
root
bin
daemon
adm
...
常用选项
选项 参数 说明
-F 指明输入时用到的字段分隔符 如果不指定默认代表用正则表达式匹配多个空白字符
-v var=value: 自定义变量  
变量 介绍 说明
FS 输入字段分隔符,默认为空白 同-F效果一样
OFS 输出字段分隔符,默认为空白字符 ‘{print $1,OFS,$2}’
RS 输入记录分隔符,指定输入时的换行符,原换行符仍有效  
ORS 输出记录分隔符,输出时用指定符号代替换行符  
NF 字段数量  
NR 行号  
FNR 各文件分别计数,行号 awk ‘{print FNR}‘ /etc/fstab /etc/inittab
FILENAME 当前文件名  
ARGC 命令行参数个数  
ARGV 数组,保存的是命令行所给定的各参数  
格式化输出参数 介绍
%c 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E 显示科学计数法数值
%f 显示为浮点数
%g, %G 以科学计数法或浮点形式显示数值
%s 显示字符串
%u 无符号整数
%% 显示% 自身
#[.#] 第一个数字控制显示的宽度;第二个# 表示小数点后精度,%3.1f
基本结构

awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }‘ file ...

awk 程序通常由:BEGIN语句块(最初执行)、被模式匹配的语句块(中间执行)、END语句块三部分构成(最后执行)。program通常被单引号或双引号引中。不一定每种模式一定要用,pattern会最常用到 。

基本格式
print标准输出 printf 格式化输出

print

   需要显示的内容逗号分割,支持字符串、数值、当前记录的字段、变量或者awk的表达式。


     awk -F: ‘{print $1,$3}‘ /etc/passwd($0代表整行)

     awk -F: ‘{print length($1),$1}‘ /etc/passwd

     awk -F: ‘i=1;j=1{print i,j}‘  /etc/passwd请注意这里有个坑,写之前想下会是什么结果,看打印出来和自己想的是不是一样

printf

  不会自动换行 需要制定换行控制符  “\n”  需要指定格式,使看起来更简洁

[[email protected] testscr]# awk -F: ‘{printf "%-20s%s\t%s\n",$1,$2,$3}‘ /etc/passwd

root x 0

bin x 1

bin x 1

bin x 1

.....

逻辑操作符和算术运算符
算术运算支持赋值、算术运算、算术比较、模式匹配,支持正则。
逻辑操作符理论上最好只有一个&&或者|| 这样可视性强
     
    awk –F: ‘$3>=0 && $3<=1000 {print $1}‘ /etc/passwd
   awk -F: ‘$3==0 || $3>=1000 {print $1}‘ /etc/passwd
BEGIN/END 模式
awk -F: ‘BEGIN{print "AAAAAAAA"}{printf "%-15s%-20d\n",$1,$3}END{print "BBBBBBBB"}‘ /etc/passwd

AAAAAAAA
root           0
bin            1
bin            1
bin            1
...
BBBBBBBB

先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
性能比较time
测试计算100以内3的倍数相加得数 显示耗时
[[email protected] testscr]# time (seq -s + 3 3 100|bc)
1683

real	0m0.015s
user	0m0.008s
sys 	0m0.006s
条件表达式(三目表达式)
selector?if-true-expression:if-false-expression

如果?之前的条件为真执行:之前的条件如果?之前的条件为假则执行最后的条件
最后一个字段($NF)不等于 /sbin/nologin 为真,执行name="sysuser" ,在执行最后的条件。

awk -F: ‘$NF != "/sbin/nologin"?name="sysuser":name="user"{printf "%-20s:%s\n",$1,$3}‘ /etc/passwd
连接当前主机次数前三的IP
netstat -nt | awk ‘/^tcp/{print $(NF-1)}‘ | awk -F: ‘{print $1}‘ | sort | uniq -c | sort -nr | head -n3

访问太过频繁有危险扔黑名单 例如是 192.168.22.129的IP
iptables -A INPUT -s 192.168.22.129 -p tcp --dport  80 -j REJECT
条件语句和shell脚本编程里类型一样的,只不过这个不换行,而且使用括号的方式更类似C语言。接下来举两个例子
查看用户属于是普通用户还是系统用户。
[[email protected] testscr]# awk -F: ‘{print $3,$4}‘ /etc/passwd | awk ‘{i=1;while(i<=NF){if($i<500)print $i,"smaller";else print $i,"bigger";i++}}‘
0 smaller
0 smaller
993 bigger
113 smaller
113 smaller
995 bigger
992 bigger
......

打印UUID 开头的行的每段有多少字符

[[email protected] testscr]# awk ‘/^UUID/{i=1;while(i<=NF){print length($i);i++}}‘ /etc/fstab
41
1
4
8
1
1
41
......

找到/etc/grub2.cfg中开头可以有空白字符的行 后面跟linux16的行 显示并且显示有多少字符

[[email protected] testscr]# awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10)print $i,length($i);i++}}‘ /etc/grub2.cfg
/vmlinuz-3.10.0-327.el7.x86_64 30
root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46
crashkernel=auto 16
......

do-while的用法 while是条件为真执行循环,do是不管真假先执行一次。这是唯一的区别

[[email protected] testscr]# awk ‘/^[[:space:]]*linux16/{i=1;do{print $i,length($i);i++}while(i<=NF)}‘ /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-327.el7.x86_64 30
root=UUID=2a9b6b86-35c8-415b-852a-78c30911a93c 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=en_US.UTF-8 16
......

使用awk while循环实现1到100的加法
[[email protected] testscr]# awk ‘BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}‘
5050
时间: 2024-12-02 20:45:47

文本处理三剑客之awk(报告生成器)的相关文章

漫漫运维路——文本处理三剑客之awk基础

awk即gawk,是一款在Linux中实现文本格式化输出的文本处理工具,在Linux中与文本过滤工具grep和文本行编辑器sed共同组成Linux中的文本处理三剑客. awk在处理文本时以行为单位,读入整行数据后以指定的分隔符对行进行切片,然后再针对切片后的数据进行处理.如下图所示: 文本经过指定的分隔符进行切片后再对每一片进行处理,然后在根据设定的动作对处理后的文本执行动作,而切片后的文本如果只想引用一部分也可以使用变量进行引用,其引用的各个变量如下表所示: 变量 指代 $0.$N 当前处理行

Liunx文本处理三剑客之awk

AWK是Aho, Weinberger, Kernighan三个开发者的首字母,最早用于Unix中,后用于Liunx中称为gawk(GUN awk),是Linux中文本处理三剑客之一,它是一个报告生成器,可以格式化文本并输出.下面所说的awk即gawk,那么我们一块来看一awk常用的用法: gawk - pattern scanning and processing language 字面翻译为:模式扫描及处理语言.也可以说他是一个简单的编程语言.工作原理如下: 按行读取文本,并根据指明输入时用

Linux系统文本处理三剑客之awk

GNU awk: 文本处理三剑客:grep,sed,awk grep,egrep,fgrep:文本过滤工具:pattern sed:行编辑器 模式空间.保持空间 awk:报告生成器,格式化文本输出 gawk - pattern scanning and processing language 基本用法:gawk [options] 'program' FILE ... program:PATTERN{ACTION STATEMENTS} 语句之间用分号分隔 print,printf 选项: -F

Linux文本处理三剑客之awk详解

前言 awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出.awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能.处理对象一般纯文本文件或纯文本信息. 用法详解 基本语法 awk [options] 'program' file file ... awk [options] 'PATTERN{action}' file file ... -F CHAR:输入分隔符 awk的输出

Awk报告生成器

一.awk概念以及使用格式 Awk是一个强大的报告生成器,awk自身具有遍历的功能,支持条件循环,就是一个编程语言,awk 的输出  1.print命令 后接各项目使用逗号分割,而输出时则使用输出符分割.2.输出是个字符串或数值,当记录的字段.变量或awk的表达式:数值会被隐式转换为字符串后输出.3.print后面如果省略相当于$0 输出空白print"".4.显示当前系统上.如果print后接选项没有逗号只有空格输出的结果连载一起{print $1 $7} 1.Awk 的变量分为内置

awk——报告生成器

文本处理三剑客--grep,awk,sed:grep是基于pattern过滤输出,有三种模式,grep,egrep以及fgrep:sed则是一种流编辑器,进行插入删除,常用于进行文本中的替换操作:而awk的功能就更加强大了,作为一种格式化文本工具,awk通过分隔符控制文本,awk默认的分隔符是空格:awk还可以通过pattern匹配按行进行遍历,通过算术表达式对行进行排查,还可以for,while,continue,break等控制语句找到符合条件的信息进行输出:他还可以对输出的结果进行修饰采用

文本处理三剑客之awk——从入门到放弃

awk是文本处理三剑客之首,功能及其强大且支持正则表达式(包括基础正则和拓展正则). awk支持(三剑客都支持)以文件作为操作对象,以及从标准输出里面接受内容. [[email protected] ~]# head /etc/passwd | awk -F ":" '{print $1}'rootbindaemonadmlpsyncshutdownhaltmailoperator [[email protected] ~]# head /etc/passwd > test[[e

文本处理三剑客之一----------awk

简单的说awk是一门类似于shell的编程语言,是一种强大的文本处理工具,它的设计思想来源于 SNOBOL4 .sed .Marc Rochkind设计的有效性语言.语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想. 它有着属于自己的独特的语法表达方式,虽然操作可能会比较复杂,但是语法格式始终都是: awk [options] 'program' file- program: {pattern + action}' 或者  'pattern {action}' patt

文本处理三剑客之AWK

AWK的基本格式:    awk [options] 'program' file-          注释:     program->pattern{action statements;..}    pattern和action:    pattern部分决定动作语句何时触发及触发事件 (BEGIN,END)    action statements对数据进行处理,放在{}内指明 (print, printf) awk工作原理: 第一步:执行BEGIN{action;- }语句块中的语句 第