shell脚本中AWK

一.AWK简介

  • AWK是一种完整的编程语言,专门用于对文本和数据进行处理和分析。
  • 它的语法相对简单,但非常强大,可以实现复杂的文本处理任务。
  • AWK的主要特点是按字段分割输入文本,并且可以对每个字段进行操作。
  • 可以实现各种操作,如计算、条件判断、循环等,非常适用于数据处理和分析任务。
  • 在Shell脚本中,可以通过调用AWK来实现文本处理和分析,使得脚本更加灵活和强大。

二.工作原理

awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

  1. 输入分割: AWK 将输入按照指定的字段分隔符(默认为空格)进行分割,并将每行数据分解成多个字段。这样就可以针对每个字段进行操作和处理。

  2. 模式-动作: AWK 的基本工作方式是对输入的每一行执行一系列的模式-动作对。如果某行满足指定的模式,则执行相应的动作。如果没有指定模式,则默认对所有行执行相应的动作。

  3. 默认动作: 如果没有指定动作,则默认动作是打印整行数据。这使得 AWK 在没有显式指定动作的情况下,仍然能够输出处理后的数据。

  4. 内置变量: AWK 提供了一些内置变量,例如 $0 表示整行数据,$1, $2, ... 表示第 1、2、... 个字段的值。这些内置变量可以在动作中使用,方便对数据进行操作和处理。

  5. 条件判断和循环: 在 AWK 中可以使用条件判断和循环结构,使得对数据的处理更加灵活和高效。通过条件判断和循环,可以根据需要执行不同的操作,或者对数据进行多次处理。

  6. 输出格式化: AWK 不仅可以处理输入数据,还可以根据需要对输出进行格式化。通过指定输出格式和使用内置的输出函数,可以将处理后的数据按照指定的格式输出到标准输出或者文件中。

三.基础用法

说明:

program通常是被放在单引号中,并可以由三种部分组成

  • BEGIN语句块

  • 模式匹配的通用语句块

  • END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符

  • -v var=value 变量赋值

Program格式:

pattern{action statements;..}       
  • pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等

  • action statements:对数据进行处理,放在{}内指明,常见:print, printf

    • output statements:print,printf

    • Expressions:算术,比较表达式等

    • Compound statements:组合语句

    • Control statements:if, while等

    • input statements

格式:

awk 选项 '模式或条件 {操作}' 文件1 文件2 ...

awk -f 脚本文件 文件1 文件2 .....

示例:

(1)打印( “{}”大括号里面为一个操作,print默认打印一个文件的内容 )

(2)打印hello,输入任何字符都打印hello

(3)运算

(4)打印匹配文件中含有root的行   awk '/root/ {print}' 

(5) awk  '{print  $0}'  没有指定行则打印所有内容

四.AWK常见的内置变量

格式:awk 选项  '模式{print }'

内置变量说明
FS指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
OFS输出时的分隔符
NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
FILENAME被处理的文件名
RS行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

示例:

使用数字处理行内容

(1)打印文件中的1-3行的两种方式

(2)打印文件全部内容,“||”表示或的意思(满足一个条件即可执行)

         打印文件的第一行和第三行

(3)打印偶数行和奇数行

(4)使用字符串处理文件内容

(5)打印文件内容的行号和全部内容

(6)以冒号为分隔符打印出/etc/passwd中第三字段大于1000的行的第一字段和第三字段

 awk -F: '$3>=1000 {print $1,$3}' /etc/passwd

(7)以冒号为分隔符打印出/etc/passwd中第三字段小于50的行的第一字段和第三字段

(8)打印/etc/passwd文件中以:为分隔符的行的第一字段和最后一个字段

(9)打印以:为分隔符,$NF最后一字段中包含bash的行的第一字段与最后一字段

(12)RS行分隔符

以:为行分隔符输出每行的行号和内容

(11)$n 当前处理行的第n个字段

  1. $n ~ "字符串" 代表打印出第n个字段中包含某字符的行

  2. $n =="字符串" 代表打印出第n个字段中为某字符串的行

  3. $n != "字符串" 代表打印出第n个字段中不为某字符的串行

示例:

过滤网卡地址

五.BEGIN和END

格式:awk 'BEGIN{ ..};{..} ;END{.. .}' 文件

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块

示例:

使用BEGIN输出指定字符的行并统计一共有多少行

awk 'BEGIN{i=0};/\/bash$/{i++};END {print i}' /etc/passwd

统计以/bin/bash 结尾的行数,等同于grep -c "/bash$"

以“:”为分隔符统计行数

六.自定义变量

在awk中,可以使用自定义变量来存储数据或计算结果。自定义变量使用$符号后面跟着一个字母或数字表示。

printf   
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值 
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身

示例

打印每个用户的用户名

awk -F:  '{printf "%s\n",$1}' /etc/passwd
不会自动换行\n 换行符

七.模式处理动作

awk '模式{处理动作}'

PATTERN:根据pattern条件,过滤匹配的行,再做处理

1.模式为空

如果模式为空表示每一行都匹配成功,相当于没有额外条件

2.正则匹配

/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

awk  '/^UUID/{print $1}'  /etc/fstab
#在/etc/fstab文件中提取以UUID开头的行并打印第一字段,默认分隔符为空格

3.line  ranges 行范围

不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系

算术操作符
x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值
比较操作符:
==, !=, >, >=, <, <=
#####逻辑
与:&&,并且关系
或:||,或者关系
非:!,取反
模式匹配符:
~ 左边是否和右边匹配,包含关系
!~ 是否不匹配

示例:

awk -F: '$1~"root"{print $1,$3} ' /etc/passwd
#打印出第一字段中包含root的行中的第一列于第3列

4.与if语句或者while或三目运算符等一起使用时需要再嵌套一个大括号{ }

三元运算符:

(条件表达式)?(A表达式或者值):(B表达式或者值)

条件表达式成立为真时会取:号前面的A的值

条件表达式不成立为假时会取:号后面的B的值

示例

比较第三字段UID与第四字段GID,打印出UID和GID中的的最大值与用户名

八.AWK实际案例

查看内存使用率

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值