Linux学习速记-50+AWK命令速查清单表

admin 2025年6月18日21:01:23评论0 views字数 3780阅读12分36秒阅读模式

AWK 速查表

概述

Linux学习速记-50+AWK命令速查清单表
img

简介 #

AWK 是一种专为文本处理和数据提取设计的通用编程语言。该语言名称源自其三位创造者——阿尔弗雷德·艾侯、彼得·温伯格和布莱恩·柯林汉的姓氏首字母,特别适合处理结构化数据,如日志文件、CSV 文件及其他基于文本的格式。

这份速查表可助您快速掌握 AWK 技巧。

基础语法 #

AWK 命令的基本语法结构为:

awk 'pattern { action }' filename
  • pattern:定义何时执行 action 动作。
  • action:指定当模式匹配时要执行的操作。

示例:

awk '{ print $1 }' file.txt

该命令会打印 file.txt 中每行的第一列。

变量 #

环境变量 #

不同实现的 AWK 支持多种环境变量:

变量
描述
支持方
AWKPATH
AWK 程序搜索路径
gawk
AWKLIBPATH
动态加载库的搜索路径
gawk
POSIXLY_CORRECT
启用严格的 POSIX 兼容模式
gawk, mawk
LC_CTYPE
定义字符编码
gawk、mawk、nawk
ARGC
命令行参数的数量
nawk、gawk
ARGV
命令行参数数组
nawk, gawk
ARGIND
当前正在处理文件在 ARGV 中的索引
gawk
FNR
当前文件中的记录编号
nawk, gawk
OFMT
数字输出格式(默认 %.6g)
nawk, gawk
RSTART
最近一次匹配的起始位置
nawk, gawk
RLENGTH
最近一次匹配的长度
nawk, gawk
SUBSEP
多维数组索引的分隔符
nawk,gawk
ENVIRON
包含环境变量的数组
gawk
IGNORECASE
控制不区分大小写的匹配(1 = 启用)
gawk
CONVFMT
数字转换格式(默认为 %.6g)
gawk
ERRNO
输入/输出操作失败时的系统错误信息
gawk
FIELDWIDTHS
指定用于输入解析的固定宽度字段
gawk

这些环境变量增强了 AWK 的功能,提供了对输入处理、错误报告和数值格式的控制。根据您使用的 AWK 实现,其中某些变量可能不可用。

内置变量 #

AWK 提供了多个内置变量来辅助数据处理:

变量
描述
$0
当前整行内容
2, ...
行内字段
NR
当前记录(行)编号
NF
当前行字段数量
FS
字段分隔符(默认为空格或制表符)
OFS
输出字段分隔符
RS
记录分隔符
ORS
输出记录分隔符
FNR
当前文件中的记录编号
ARGC
命令行参数数量
ARGV
命令行参数数组
FILENAME
当前输入文件名

示例:

awk '{ print NR, $0 }' file.txt

这会在每行前打印其行号。

用户自定义变量 #

AWK 允许你在脚本中定义和使用自定义变量。

自定义变量无需预先声明即可使用,初始值为空字符串或零。

定义与使用变量 #

这个 AWK 脚本定义了两个变量,执行步骤如下:

BEGIN { x = 10; y = 20; print "Sum:", x + y }
  1. BEGIN 代码块:BEGIN 是 AWK 中的特殊模式,会在处理任何输入前执行,通常用于初始化任务。
  2. 变量赋值:在 BEGIN 代码块中,两个变量 x 和 y 分别被赋值为 10 和 20
  3. 打印语句:print 命令输出字符串 "Sum:" 后接表达式 x + y 的结果,即 x 与 y 的和。

在脚本中修改变量 #

这个 AWK 脚本会修改变量。它执行以下步骤:

{ count += 1; total += $2 } 
END { print "Total records:", count; print "Sum of column 2:", total }
  1. 主代码块({ ... }

    :

    • 该代码块会对输入的每一行执行操作。
    • count += 1:每处理一行就将 count 变量增加 1,这实际上是在统计输入中的总记录数(行数)。
    • total += $2:将当前行第二个字段(列)的值累加到 total 变量中,用于计算第二列所有数值的累计总和。
  2. END 代码块

    :

    • END 代码块会在所有输入行处理完毕后执行。
    • print "总记录数:", count:打印已处理的记录(行)总数。
    • print "Sum of column 2:", total :打印第二列所有数值的总和。

命令行中的用户自定义变量 #

您也可以直接在命令行中定义变量:

awk -v myvar="Hello" 'BEGIN { print myvar }'

字段分隔符 #

AWK 使用字段分隔符将输入行分割为多个字段,这些字段可通过 $1$2 等符号访问。默认字段分隔符是任意空白字符(空格或制表符)。您可以使用 FS(输入字段分隔符)和 OFS(输出字段分隔符)变量来修改分隔符设置。

修改字段分隔符 #

您可以通过在 awk 命令中设置 FS 来更改字段分隔符:

awk 'BEGIN { FS="," } { print $1, $2 }' file.csv

这将把 FS 设置为逗号,使 AWK 能够处理逗号分隔的值。

使用 -F 选项设置字段分隔符 #

无需在 BEGIN 代码块中使用 FS,您可以通过 -F 选项指定分隔符:

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

这将字段分隔符设置为冒号(:),常用于系统文件如 /etc/passwd 中。

多字符字段分隔符 #

对于更复杂的分隔需求,可以使用正则表达式作为字段分隔符:

awk 'BEGIN { FS="[,:]" } { print $1, $2 }' file.txt

该功能支持以逗号或冒号分隔字段。

输出字段分隔符(OFS)#

要修改 AWK 输出字段的显示方式,请调整 OFS 参数:

awk 'BEGIN { FS=","; OFS="|" } { print $1, $2 }' file.csv

此操作将逗号分隔的文件转换为竖线分隔(|)格式。

使用 FIELDWIDTHS# 解析固定宽度字段

对于固定宽度数据,FIELDWIDTHS 可以明确定义列宽:

awk 'BEGIN { FIELDWIDTHS="5 10 8" } { print $1, $2, $3 }' file.txt

这将第一个字段设为5个字符,第二个字段10个字符,第三个字段8个字符。

模式匹配 #

AWK 中的模式匹配主要通过正则表达式实现。模式指定了执行关联操作必须满足的条件。AWK 支持内置的模式匹配运算符,例如 /pattern/~(匹配)和 !~(不匹配)。

  • /pattern/ 用于匹配包含指定模式的行。
  • expression ~ /pattern/ 用于检查表达式是否匹配该模式。
  • expression !~ /pattern/ 用于检查表达式是否不匹配该模式。

示例:

awk '/error/ { print $0 }' logfile.txt

这会打印出 logfile.txt 文件中所有包含"error"一词的行。

条件语句与循环结构 #

在 AWK 脚本中,你可以使用 iffor 和 while 来实现流程控制。

条件判断语句 #

使用 if 的示例:

awk '{ if ($3 > 50) print $1, $3 }' file.txt

仅当第三列数值大于50时,才会打印第一列和第三列。

循环语句 #

使用 for 循环的示例:

awk '{ for (i = 1; i <= NF; i++) print $i }' file.txt

这会将每个字段打印在新的一行。

While 循环 #

使用 while 循环的示例:

awk '{ i = 1; while (i <= NF) { print $i; i++ } }' file.txt

这段代码使用 while 循环将每个字段打印在新的一行上。

算术运算 #

AWK 支持多种算术运算:

基本算术运算符 #

操作符
描述
+
加法
-
减法
*
乘法
/
除法
%
取模(求余)
^ 或 **
幂运算

一元算术运算符 #

运算符
描述
+
一元加(正值)
-
一元减(负值)

自增和自减运算符 #

运算符
描述
++var
前递增(使用前递增)
var++
后递增(使用后递增)
--var
前递减(使用前递减)
var--
后置递减(使用后递减)

赋值运算符 #

运算符
描述
=
赋值
+=
相加并赋值
-=
相减并赋值
*=
相乘并赋值
/=
除法赋值
%=
取模赋值
^= 或 **=
指数赋值

常见问题 #

关于该主题最常见的问题及简洁易懂的解答:

AWK 有什么用途?

AWK 是一种文本处理语言,用于对文件或数据流进行模式扫描和处理。它常用于数据提取、转换和生成报告。

如何运行 AWK 命令?

你可以直接在终端运行 AWK 命令,例如:awk '{print $1}' 文件名 。这个示例会打印文件的第一列。

如何运行 AWK 脚本?

你可以使用命令 awk -f 脚本.awk 输入文件来运行 AWK 脚本,其中脚本.awk 包含你的 AWK 命令, 输入文件是数据文件。

什么是 AWK 变量?

AWK 提供了内置变量,如 NR(记录数)、NF(字段数)和 $0(整行内容)。您也可以自定义变量。

AWK 能否与正则表达式配合使用?

是的,AWK 支持正则表达式进行模式匹配。例如, awk '/pattern/ {print $0}' file 会打印包含'pattern'的行。

AWK 和 sed 有什么区别?

AWK 是一门功能完备的文本处理编程语言,而 sed 是主要用于简单文本替换和基于行编辑的流编辑器。

什么是 AWK 的模式与动作?

AWK 通过匹配输入数据中的模式并执行相应动作来工作。模式是一种条件,当满足该条件时会触发关联动作,例如打印某行内容或执行计算。

AWK 能否处理多个输入文件?

可以,AWK 能够按顺序处理多个输入文件。在命令中指定多个文件即可,例如 awk '{print}' file1 file2

原文始发于微信公众号(土拨鼠的安全屋):Linux学习速记-50+AWK命令速查清单表

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月18日21:01:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux学习速记-50+AWK命令速查清单表http://cn-sec.com/archives/4177729.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息