文本处理三剑客之awk

1. 首先简要总结一些文本处理三剑客:

grep族:文本过滤工具

sed:行编辑工具

2. 下面就来看看awk是什么?

awk现在linux上用的是GNU awk即gawk ,现在centos系统上awk是gawk的一个符号链接文件。那么awk究竟在centos系统上是用来做什么的呢?awk就是一个报告生成器,格式化文本输出的工具。

3. 学习awk对有什么帮助呢?

学习awk我们可以轻松的对我们想要处理的文本进行查看等,方便我们解决问题。

4. gawk的基本用法:

gawk - pattern scanning and processing language模式扫描及处理语言

语法: gawk  [options ] ‘program’ file ...

详说其中:

4.1 [options]:

-F指明输入时的字段分隔符

-v VAR=VALUE 主要用于实现自定义变量

4.2 program:PATTERN{ACTION STATEMENTS}

语句之间用分号分隔

内建命令: print,printf

5. 选项中的使用的变量:

5.1 变量  (注:awk中自己的变量是不能加$符的,跟bash是不一样的)

  内建变量:

FS:input field seperator 输入字段分隔符,默认为空白字符

此等同于-F分隔符

OFS:output field seperator 输出字段分隔符,默认为空白字符

eg:

[root@bucktan ~]# tail -2 /etc/fstab| awk -v OFS=':' '{print $1,$3}'

sysfs:sysfs

proc:proc

[root@bucktan ~]# tail -2 /etc/fstab

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

[root@bucktan ~]# tail -2 /etc/passwd| awk -v FS=':' '{print $1,$3}'

apple 2000

zabbix 495

RS:input record sepereator指定输入时的换行符

ORS:output record sepereator指定输出时的换行符

eg:

[root@bucktan ~]# awk -v RS=' ' -v ORS='##' '{print}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP##User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

dbus:x:81:81:System##message##bus:/:/sbin/nologin

注意看其中的#号

NF:number of field 统计每一行字段的数量

{print NF}

{print $NF}:打印最后一个字段

~]# awk '{print NF}' /etc/passwd

eg:

[root@bucktan ~]# awk -F: '{print $NF}' /etc/passwd

NR:number of record打印每一行的行号,但事实上统计的是文件的总体行数

FNR:各文件分别计数,计行数

FILENAME:当前正在处理的文件名

ARGC:命令行参数的个数

ARGV:数组,保存的是命令行所给定的各参数

ARGV[0]:第一个参数

。。。。。

eg:

[root@bucktan ~]# awk 'BEGIN{print ARGV[0]}' /etc/passwd /etc/fstab

awk

[root@bucktan ~]# awk 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab

/etc/passwd

注:BEGIN的作用是实现不会对每一行打印的结果。如果没有BEGIN则每一行都要显示一个打印的值

5.2自定义变量:

(1):-v var=value    变量名区分字符大小写

        (2):在program中直接定义

eg:

[root@bucktan ~]# awk -v abc='love you' '{print abc}’ /etc/passwd

另一种实现:

[root@bucktan ~]# awk 'BEGIN{abc="love you"; print abc} '

love you

语法: gawk  [options ] ‘program’ file ...

program:PATTERN{ACTION STATEMENTS}

      

6. 其中的內建命令

6.1:print(用于{ACTION STATEMENTS}中)

print iterm1,iterm2,。。。

要点:1):逗号为分隔符,但在输出时显示的是空白符而非逗号

            (2) :输出的各iterm可以是字符串、数值、当前记录的字段、变量或awk的表达式

           (3):如果省略iterm,相当于print$0 

eg:

[root@bucktan ~]# tail -5 /etc/passwd | awk -F: '{print "hehe:"111$1,$3}'

hehe:111tcpdump 72

hehe:111bucktan 500

hehe:111centos 496

hehe:111apple 2000

hehe:111zabbix 495

[root@bucktan ~]# tail -2 /etc/passwd | awk -F: '{print}'

apple:x:2000:2000::/home/apple:/bin/bash

zabbix:x:495:492:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin

  6.2 printf命令

printf - format and print

格式化输出:printf FORMAT iterm1,iterm2,...

要点: (1):FORMAT:必须要给出

          (2):不会自动换行,需要显示给出换行控制符才知道哪行

          (3):FORMAT中需要分别为后面的每个iterm指定一个格式化符号

    格式符:

%c:显示字符的ASCII码

%d,%i:显示十进制整数

%e,%E:科学计数法数值显示

%g,%G:以科学计数法或浮点形式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身

样式一

[root@bucktan ~]# awk -F: '{printf "%s",$1}' /etc/passwd

rootbindaemonadmlpsyncshutdownhaltmailuucpoperatorgamesgopherftpnobodydbususbmuxdvcsarpcrtkitavahi-autoipdabrtrpcusernfsnobodyhaldaemongdmntpapache

样式二

[root@bucktan ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd

root

bin

daemon

adm

lp

样式三

[root@bucktan ~]# awk -F: '{printf "username: %s\n",$1}' /etc/passwd

username: root

username: bin

username: daemon

username: adm

username: lp

样式四

[root@bucktan ~]# awk -F: '{printf "username: %s,  userid: %s\n",$1,$3}' /etc/passwd

username: root,  userid: 0

username: bin,  userid: 1

username: daemon,  userid: 2

username: adm,  userid: 3

username: lp,  userid: 4

username: sync,  userid: 5

username: shutdown,  userid: 6

username: halt,  userid: 7

username: mail,  userid: 8

  修饰符:

#[.#]:第一个数字控制显示的宽度:第二个#表示小数点的精度

如%3.1f

-:左对齐  ,不加-为默认的右对齐

+:显示数值的符号

[root@bucktan ~]# awk -F: '{printf "username: %-15s,  userid: %s\n",$1,$3}' /etc/passwd

username: root           ,  userid: 0

username: bin            ,  userid: 1

username: daemon         ,  userid: 2

##后面内容省略

   

7. 操作符

###(也是用在执行语句之中的,记得要用分号与print內建命令分开)

算术操作符:

x+y ,x-y,x*|/|^|%y

-x:负值

+x:转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:=,+=,-=,*=,/=,%=,++,--

比较操作符:>,<,>=,<=,!=,==

模式匹配符:

~:是否匹配

!~:是否不匹配

逻辑操作符:&&,||,!

函数调用:function_name()  ,

若要传递参数使用:function_name(argu1,argu2,。。)

条件表达式:selector?if-true-expression:if-false-expression

selector为条件

if-true-expression:条件为真的表达式

if-false-expression:条件为假的表达式

eg:

[root@bucktan ~]# awk -F: '{$3>=1000?usertype="common user":usertype="sysuser or root";printf "%10s:%-s\n",$1,usertype}' /etc/passwd

root:sysuser or root

bin:sysuser or root

daemon:sysuser or root

adm:sysuser or root

lp:sysuser or root

sync:sysuser or root

语法: gawk  [options ] ‘program’ file ...

program:PATTERN{ACTION STATEMENTS}

8. PATTERN

(1)empty:空模式,处理文本每一行

(2):/regular expression/:仅处理能够被此模式匹配到的行

eg:

[root@bucktan ~]# awk '/^UUID\>/{print}' /etc/fstab

UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 /boot                   ext4    defaults        1 2

(3):relational expression:关系表达式,结果有“真”有”假“,结果为”真“才会被处理;

"真":表示结果为非0值,或者为非空字符串

eg:

[root@bucktan ~]# awk -F: '$3>=1000{print $3}' /etc/passwd

65534

2000

(4):line ranges 行范围

startline,endline:/pat1/,/pat2

注:支持直接给出数字

eg:

[root@bucktan ~]# awk -F: '/^root\>/,/^adm\>/{print $1,$3}' /etc/passwd

root 0

bin 1

daemon 2

adm 3

(5):BEGIN/END

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

[root@bucktan ~]# awk -F: 'BEGIN{print "user      id\n================"}{print $1,$3}END{print "end\n-----------"}' /etc/passwd

user      id

================

root 0

bin 1

daemon 2

adm 3

[root@bucktan ~]# awk -F: 'BEGIN{print "user      id\n================"}{printf "%10-s %10-s\n",$1,$3}END{print "end\n-----------"}' /etc/passwd

user      id

================

root       0

bin        1

daemon     2

adm        3

语法: gawk  [options ] ‘program’ file ...

program:PATTERN{ACTION STATEMENTS}

9.常用的action语句(即写在{ACTION STATEMENTS}中的语句)

a:Expressions

b:cotrol statements:if ,while 等

c:compound statements:组合语句

d:input statements 输入语句

e:output statements输出语句

9.1 :控制语句

if(condition) {statements}

if(condition) {statements} else {statements}

while(condition) {statements

do {statements} while(condition)

for(expr1;expr2;expr3) {statements}

break

continue

delete array[index]

delete array

exit

{ statements }

10.细说action语句

10.1  if -else

语法: if(condition) statements else [statements]

eg:

[root@bucktan ~]# awk -F: '{if($3>=1000) print $1,$3}' /etc/passwd

nfsnobody 65534

apple 2000

[root@bucktan ~]# awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else { printf "root or sysuser:%s\n",$1}}' /etc/passwd

root or sysuser:root

root or sysuser:bin

root or sysuser:daemon

root or sysuser:adm

root or sysuser:lp

root or sysuser:sync

10.2 while 循环

语法:while(condition) {statements}

条件为真进入循环为假退出循环

使用场景:对一行内的多个字段逐一进行处理时使用;对数组中各元素逐一处理时使用

eg:对/etc/fstab文件中以UUID开头的行的每一个字段进行计算有多少个字符,并打印该字符段和字符数

[root@bucktan ~]# awk '/^UUID/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/fstab

UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 41

/boot 5

ext4 4

defaults 8

1 1

2 1

10.3 do-while (先运行一次循环体,在判断条件)

语法:do {statements} while(condition)

意义:可以至少执行一次循环体

10.4 for循环

语法:for(expr1;expr2;expr3) {statements}

eg:

[root@bucktan ~]# awk '/^UUID/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/fstab

UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 41

/boot 5

ext4 4

defaults 8

1 1

2 1

特殊用法:

能够遍历数组中的元素

语法:for (var in array) {for-body}

10.5 switch语句

语法:switch(expression) {case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP/:statement;....;default:statement}

注:其中之一分支匹配到,则执行此分支不执行其他分支了

10.6 break和continue

break [n]:退出n层循环

continue:退出当前循环

10.7 next 提前结束对本行的处理而直接进入下一行

eg:

[root@bucktan ~]# awk -F: '{if($3%2!=0) next ;print $1,$3}' /etc/passwd

root 0

daemon 2

lp 4

shutdown 6

  10.7 array

关联数组:arry[index-expression]

index-expression:

(1):可使用任意字符,字符串要使用双引号

(2):如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”

若要判断数组中是否存在某元素,要使用“index in array”格式进行

11:函数

11.1:内置函数

数值处理:

rand()::返回0和1之间一个随机数;

字符串处理:

length([s]):返回指定字符串的长度;

sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;

split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'

学习笔记之awk用法相关推荐

  1. Puppeteer 学习笔记及基本用法

    Puppeteer 学习笔记及基本用法 Puppeteer 安装 语法 基本语法 API 分层结构 加载导航页面 等待元素.请求.响应 自定义等待 元素定位 用户模拟操作 请求拦截 获取 WebSoc ...

  2. 情态动词学习笔记(4) 基本用法:建议和忠告

    情态动词学习笔记(4) 基本用法:建议和忠告 could 表建议 it is a nice day. we could go for a walk. 今天天气不错,我们可以出去散步 shall用于第一 ...

  3. socket编程学习笔记:部分函数用法以及accept函数问题

    学习笔记:socket编程部分函数用法 socket()函数: bind()函数: listen()函数: accept()函数: connect()函数: socket()函数: socket函数对 ...

  4. SQL学习笔记 where子句用法,like关键字 嵌套查询

    where子句 比较运算符: < , <= , > , >= , = , != , !< , !> .  text , ntext , image .型数据不可用. ...

  5. 学习笔记之sed用法

                          Sed命令用法 sed是文本三剑客之一 sed是什么? Sed:行编辑工具,处理一行文本.一次从文本中读取一行,将这一行放在自己的模式空间中,如果能被sed ...

  6. java学习笔记(五)----super用法,final用法,抽象类,接口

    子类不会继承父类的构造方法,在子类的构造方法中可使用super(参数列表)调用父类的构造方法. class Person { String name;   int age;   public Pers ...

  7. Boostrap学习笔记一: popover用法

    最近在自学java web基础,搭建自己的页面时候用到了Boostrap的JS库.由于之前没有接触过JQuery,所以用起来磕磕绊绊,所以在这里简单记一下Boostrap中我用到的JS 插件的一些用法 ...

  8. linux之awk命令学习笔记

    Linux之awk命令学习笔记 前言 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, ...

  9. lambda表达式浅析【C++学习笔记】

    lambda表达式浅析[C++学习笔记] 基本用法: auto f = [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/{/** 函数体*/}; 捕获列表: [] : 不捕 ...

最新文章

  1. 精通python能干嘛-一个程序员怎样才算精通Python?
  2. Bootstrap – 1.认识
  3. 深入理解Linux内核之内存寻址
  4. java 子类重定义变量_java子类对象和成员变量的隐写方法重写
  5. Centos7 install Openstack - (第三节)添加镜像服务(Glance)
  6. appium学习记录1
  7. 阿里云物联网边缘计算加载MQTT驱动
  8. 全世界最全牛人的博客
  9. Base64解码文件下载
  10. oracle recover database,standby库,在sqlplus下用recover standby database进行手工恢复
  11. todo Java注解
  12. mysql 默认排序是什么意思,MySQL 默认排序是什么
  13. 教你写递归——递归三部曲
  14. 第一章 Python基础
  15. 程序员如何阅读英文资料
  16. 【CSDN软件工程师能力认证学习精选】 JavaEE 13个核心规范
  17. coolpad s6 android 6,酷派S6手机做工怎么样 酷派S6拆机图解详细评测
  18. 关于Unity通过webgl打包中文消失问题
  19. linux下格式化U盘的方法
  20. 3.17√ 识别次读入的一个以@为结束符的字符序列是否为形如”序列1序列2“模式的字符序列 ,序列12均没有,且序列2为序列1的逆序列

热门文章

  1. 大神干货:冠军选手分享解题思路,助你轻松突围初赛
  2. NLP简报(Issue#1)
  3. java可以使用python的库函数_java调用python方法总结
  4. 从0成为Facebook广告高手系列教程
  5. 如何打造千万播放量的Tiktok
  6. 232 Crossword Answers
  7. 计算机开放电子书归档 2018
  8. 不得不会的10点Java基础知识
  9. python教材答案第四章_python核心编程课后习题解答第四章
  10. java.sql.SQLSyntaxErrorException: Unknown column ‘###‘ in ‘field list‘