《快学BigData》--Linux awk命令详解(9)

2023-03-06 21:10:14 浏览数 (3)

Linux awk命令详解

1-1)、基本语法

[root@hadoop1 /]# awk ‘pattern action’ {filename}

A)、书写格式

命令行模式

[root@hadoop1 /]# awk -F":" '{print $1}' /etc/passwd

文本模式

[root@hadoop1 /]# vi testAwk.sh

#!/usr/bin/awk

BEGIN{FS=”:”}

{print $1}

B)、变量

常用内置变量

$0 当前所有的字段

0 - n 系统的内置变量,当前第n个字段

NF 输入来记录的分隔符(默认的是空格)

NR 行号

FS : field separator,读取文件本时,所使用字段分隔符

RS : Record separator,输入文本信息所使用的换行符

OFS : Output Filed Separator,文件分隔符

ORS:Output Row Separator,行分隔符

外置变量

awk -v n="test" 'BEGIN{print n}'

- v :传参的参数

C)、操作符

关系操作符:< , > , <= , >= , == , != , ~ , !~

~ : 表示匹配的意思

!~ : 表示不匹配的意思

例如:[root@hadoop1 /]# awk -F":" '

[root@hadoop1 /]# awk -F":" '

布尔操作符:&& , || , !

D)、 print与printf的区别

print : 直接输出变量值或给定的字符串

Printf: 可以实现格式化输出

[root@hadoop1 /]# awk -F":" '{printf(

1-2)、awk 流程控制

A)、条件

实例一

[root@hadoop1 /]#awk -F":" '{if(

pk

No

***********

实例二

[root@hadoop1 /]#awk -F":" '{if(

$NF :是表示最后一个单词的记录

B)、while语句

实例一

[root@hadoop1 /]#awk -F":" '{i=1;while(i<=NF){print(i,$i);i }{print " "}}' /etc/passwd

实例二

[root@hadoop1 /]# awk -F":" '{for(i=1;i<=NF;i ){print(i,$i)}{print " "}}' /etc/passwd

C)、数组

[root@hadoop1 /]#awk -F":" '{a[$NF] }END{for(i in a){print i":"a[i]}}' /etc/passwd

1-3)、函数

A)、算数函数

int(x) : 返回X的整数部分的值

sqrt(x) : 返回x的平方根

rand() : 返回伪随机数r,其中0<=r<1

srand : 建立rand()新的种子数,如果没有制定就用当天的时间

B)、算数函数

sub(),gsub() : 替换函数

Index(s,t) : 返回子串t在字符串s中的位置,如果没有则返回0

length(s) : 返回字符串长度,当没有给出s时,返回$0的长度

match(s,a,seq) : 使用seq将字符串s分解到数组a中,默认seq伪FS

sub(),gsub() : 替换函数

Index(s,t) : 返回子串t在字符串s中的位置,如果没有则返回0

length(s) : 返回字符串长度,当没有给出s时,返回$0的长度

match(s,a,seq) : 使用seq将字符串s分解到数组a中,默认seq伪FS

C)、自定义函数

[root@hadoop1 /]# awk 'function sum(n,m){total=n m;return total}BEGIN{print sum(5,8)}'

13

1-4)、awk 实战

A)、获取IP地址

[root@hadoop1 /]# ifconfig wlp3s0 | grep -w "inet" | awk '{print $2}'

192.168.199.137

B)、查找制定字段的运行时间

[root@hadoop1 /]# ps -ef|grep java | awk '{print $7}'

00:00:00

C)、对每一个分隔符添加相对应的字符

[root@hadoop1 /]# nl passwd | awk -F":" '{print $1 "*****" $7}'| head -n 5

     1root*****/bin/bash

     2daemon*****/usr/sbin/nologin

     3bin*****/usr/sbin/nologin

     4sys*****/usr/sbin/nologin

     5sync*****/bin/sync

[root@hadoop1 /]# $ nl passwd | awk 'BEGIN{FS=":";OFS="****"}{print $1,$7}' | head -n 5

     1root****/bin/bash

     2daemon****/usr/sbin/nologin

     3bin****/usr/sbin/nologin

     4sys****/usr/sbin/nologin

     5sync****/bin/sync

记录当前的field个数

$ nl passwd | awk 'BEGIN{FS=":";OFS="****"}{print $1,$7,NF}' | head -n 5

     1root****/bin/bash****7

     2daemon****/usr/sbin/nologin****7

     3bin****/usr/sbin/nologin****7

     4sys****/usr/sbin/nologin****7

     5sync****/bin/sync****7

1 人点赞