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
    评论
### 回答1: awk是一种文本处理工具,常用于shell脚本。它可以读取文本文件,对每一行进行处理,并输出结果。awk的基本语法为: awk 'pattern {action}' file 其,pattern是一个正则表达式,用于匹配文本的某些行;action是一个命令序列,用于对匹配到的行进行处理。awk会自动将每一行分割成若干个字段,可以通过$1、$2等变量来访问这些字段。例如,以下命令可以输出文件第一列的内容: awk '{print $1}' file 除了基本语法外,awk还有很多高级用法,例如可以使用内置函数、变量、数组等。可以参考awk的官方文档或其他教程来学习更多内容。 ### 回答2: awk是一种文本处理工具,在shell脚本经常用于对数据文件进行处理。它可以对文件进行逐行扫描,并按照指定的规则进行分割、匹配和处理。以下是awkshell脚本的用法详解: 1. 基本语法 awk 'pattern { command }' filename 其,pattern是匹配模式,用于匹配文件的文本;command是要执行的命令,可以是一行或多行。filename是要处理的文件名。 2. 变量 在awk有很多内置变量可以使用,例如: - $0:表示整行文本 - $1, $2, $3...:表示第一、二、三列文本 - NF:表示当前行的列数 - NR:表示当前行的行号 - FS:表示字段分隔符,默认为制表符或空格 可以使用这些变量来进行数据的处理和统计。 3. 示例 下面是一些常用的awk示例: (1)从文件抽取出第一列 $ awk '{print $1}' file.txt (2)统计文件每行的单词数 $ awk '{print NF}' file.txt (3)筛选出文件包含关键词的行 $ awk '/keyword/' file.txt (4)计算文件各列的和 $ awk '{sum += $1 + $2 + $3} END {print sum}' file.txt (5)替换文本的字符串 $ awk '{gsub("oldstring", "newstring")}1' file.txt 4. 总结 awk是一种非常强大的文本处理工具,它能够根据指定的模式从文本提取信息,并对其进行处理和统计。熟练掌握awk的使用可以让我们更轻松地处理和分析大量文本数据。 ### 回答3: Shell脚本是编程语言之一,它可以利用awk命令来处理和分析文本数据。awk命令是Linux/Unix系统经常使用的一个工具,可以对文本文件或标准输入数据进行扫描、过滤、处理和分析,从而很好地完成文本处理的任务。 在Shell脚本,使用awk命令需要按照如下结构: ```bash awk 'commands' filename ``` 其,`commands`是awk命令的参数,可以是简单的字符串或复杂的处理脚本。`filename`是需要处理和分析的文件名或者通过管道传输的标准输入数据。 awk命令的一些常用参数和语法如下: 1. `awk '{pattern + action}' filename`:在文件搜索指定的模式或文本,并对匹配模式的行执行指定的操作。 2. `awk '{print $n}' filename`:将文件的某列数据提取出来进行打印输出,$1表示第一列数据,$2表示第二列数据,以此类推。 3. `awk -F: '{print $1,$3}' filename`:指定文件的分隔符为“:”,然后提取文件的第一列和第三列数据。 4. `awk '{sum+=$1} END {print sum}' filename`:计算文件的数据列的总和值,并进行输出。 5. `awk '/re/ {print $0}' filename`:搜索指定的正则表达式re,并将匹配的行输出。 6. `awk '{if($1="xxx") print $0}' filename`:对文件的指定数据列进行筛选,符合条件就进行输出。 以上是awk命令的一些常用参数和语法,值得注意的是,awk命令非常强大,可以完成很多复杂的文本处理和数据分析,几乎可以操作所有的文本数据。所以,对于Shell脚本awk用法,需要根据具体的需求和场景进行灵活运用和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值