Linux---awk使用指南

本文详细介绍了awk命令的使用,包括基本格式、自定义分隔符、内置变量的运用,以及BEGIN和END关键字的使用方法。awk作为强大的数据处理引擎,通过处理文本文件的每一行,提供条件判断、正则表达式等功能,适用于复杂的数据分析任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk是一个强大的数据处理引擎,相对于grep的查找,sed的编辑,awk对数据的分析和生成的报告更强大

  • awk 命令处理一个或者多个文件的时候,它会依次读取文件的每一行内容, 然后对其进行处理
  • awk 命令默认从 stdio 标准输入获取文件内容
  • awk 使用一对单引号来表示 一些可执行的脚本代码
  • 在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块
  • awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔

awk 其实就是一个脚本编程语言

请记住 awk 是针对文件的每一行来执行一次单引号 里面的脚本代码,每读取到一行就会执行一次,文件里面有多少行就会执行多少次,但 BEGIN 和 END 关键字后面的 脚本代码除外,如果被处理的文件中什么都没有,那 awk 就一次都不会执行

1–awk命令的基本格式

awk [options] 'program' file
  • options 表示一些可选的参数选项(可选)
  • program 表示 awk 的可执行脚本代码(必选)【单引号】【花括号里面的是可执行脚本代码】
  • file 表示 awk 需要处理的文件(注意是纯文本文件

实战例子

$ awk '{print $0}' /etc/passwd
  1. 可执行脚本代码使用单引号括起来
  2. 花括号里面就是一些可执行的脚本代码段
    当 awk 每读取一行之后,它会依次执行双引号里面的每个脚本代码段

2–awk 自定义分隔符

1、awk 默认的分割符为空格和制表符,可以使用 -F 参数来指定分隔符

实战例子

$ awk -F ':' '{print $1}' /etc/passwd

上面的命令将 /etc/passwd 文件中的每一行用冒号 : 分割成多个字段,然后用 print 将第 1 列字段的内容打印输出

2、在 -F 参数中使用一对方括号来指定多个分隔符

$ awk -F '[()]' '{print $1, $2, $3}' some.log

awk 处理 some.log文件时就会使用 “(” 和 “)” 来对文件的每一行进行分割

3–awk 内置变量的使用

  1. $0 这个表示文本处理时的当前行
  2. $1 表示文本行被分隔后的第 1 个字段列
  3. $2 表示文本行被分割后的第 2 个字段列
  4. $3 表示文本行被分割后的第 3 个字段列
  5. $n 表示文本行被分割后的第 n 个字段列
  6. NR 表示文件中的行号,表示当前是第几行
  7. NF 表示文件中的当前行中列的个数,类似于 mysql 数据表里面每一条记录有多少个字段。
  8. FS 表示 awk 的输入分隔符,默认分隔符为空格和制表符,可以对其进行自定义设置
  9. OFS 表示 awk 的输出分隔符,默认为空格,可以对其进行自定义设置
  10. FILENAME 表示当前文件的文件名称,如果同时处理多个文件,它也表示当前文件名称

实战例子
1 - 打印输出文件的每一整行的内容

$ awk '{print $0}' fruit.txt

2 - 打印输出文件的每一行的第 1 列内容

$ awk '{print $1}' fruit.txt

3 - 打印输出文件的每一行的第 1 列、第 2 列和第 3 列内容(其中加入的逗号表示插入输出分隔符,也就是默认的空格

$ awk '{print $1, $2, $3}' fruit.txt  

4 - 文件的每一行的每一列的内容除了可以用 print 命令打印输出以外,还可以对其进行赋值(表示通过对 $2 变量进行重新赋值,来隐藏每一行的第 2 列内容)

$ awk '{$2 = "***"; print $0}' fruit.txt  

5 - 在参数列表中加入一些字符串或者转义字符(使用双引号)

$ awk '{print $1 "\t" $2 "\t" $3}' fruit.txt  

6- awk 内置 NR 变量表示每一行的行号

$ awk '{print NR "\t" $0}' fruit.txt

7 - awk 内置 NF 变量表示每一行的列数

$ awk '{print NF "\t" $0}' fruit.txt

8 - awk 中 $NF 变量的使用

$ awk '{print $NF}' fruit.txt    //最后一列
$ awk '{print $(NF - 1)}' fruit.txt  //倒数第二列

上面这个 $NF 就表示每一行的最后一列,因为 NF 表示一行的总列数,然后在其前面加上 $ 符号,表示最后那一列

9 - 同时处理多个文件

$ awk '{print FILENAME "\t" $0}' fruit.txt company.txt

当使用 awk 同时处理多个文件的时候,它会将多个文件合并处理,变量 FILENAME 就表示当前文本行所在的文件名称。

4–BEGIN 关键字的使用

在脚本代码段前面使用 BEGIN 关键字时,它会在开始读取一个文件之前,运行一次 BEGIN 关键字后面的脚本代码段, BEGIN 后面的脚本代码段只会执行一次,执行完之后 awk 程序就会退出

$ awk 'BEGIN {print "Start read file"}' /etc/passwd

awk 脚本中可以用多个花括号来执行多个脚本代码

$ awk 'BEGIN {print "Start read file"} {print $0}' /etc/passwd

5–END 关键字使用方法

awk 的 END 指令和 BEGIN 恰好相反,在 awk 读取并且处理完文件的所有内容行之后,才会执行 END 后面的脚本代码段

$ awk 'END {print "End file"}' /etc/passwd
$ awk 'BEGIN {print "Start read file"} {print $0} END {print "End file"}' /etc/passwd

6–在 awk 中使用变量

在 awk 脚本中声明和使用变量

$ awk '{msg="hello world"; print msg}' /etc/passwd

awk 声明的变量可以在任何多个花括号脚本中使用

$ awk 'BEGIN {msg="hello world"} {print msg}' /etc/passwd

7–在 awk 中使用数学运算

$ awk '{a = 12; b = 24; print a + b}' company.txt

先声明两个变量 a = 12 和 b = 24,然后用 print 打印出 a 加上 b 的结果

符号名称
+加法运算符
-减法运算符
*乘法运算符
/除法运算符
%取余运算符

8–在 awk 中使用条件判断

判断文件的第 3 列数据,然后将其打印输出

$ awk '$3 < 5500 {print $0}' company.txt  //两条指令效果相同
$ awk '{if ($3 < 5500) print $0}' company.txt    ////两条指令效果相同

$3 < 5500 表示当第 3 列字段的内容小于 5500 的时候才会执行后面的 {print $0} 代码块

$ awk '$1 == "yahoo" {print $0}' company.txt
符号名称
<小于
<=小于或等于
==等于
!=不等于
>大于
>=大于或等于
~匹配正则表达式
!~不匹配正则表达式

9–在 awk 中使用正则表达式

对正则表达式不熟悉,就先不写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值