AWK 速查表
概述
简介 #
AWK 是一种专为文本处理和数据提取设计的通用编程语言。该语言名称源自其三位创造者——阿尔弗雷德·艾侯、彼得·温伯格和布莱恩·柯林汉的姓氏首字母,特别适合处理结构化数据,如日志文件、CSV 文件及其他基于文本的格式。
这份速查表可助您快速掌握 AWK 技巧。
基础语法 #
AWK 命令的基本语法结构为:
awk 'pattern { action }' filename
-
pattern
:定义何时执行action
动作。 -
action
:指定当模式匹配时要执行的操作。
示例:
awk '{ print $1 }' file.txt
该命令会打印 file.txt
中每行的第一列。
变量 #
环境变量 #
不同实现的 AWK 支持多种环境变量:
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这些环境变量增强了 AWK 的功能,提供了对输入处理、错误报告和数值格式的控制。根据您使用的 AWK 实现,其中某些变量可能不可用。
内置变量 #
AWK 提供了多个内置变量来辅助数据处理:
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
示例:
awk '{ print NR, $0 }' file.txt
这会在每行前打印其行号。
用户自定义变量 #
AWK 允许你在脚本中定义和使用自定义变量。
自定义变量无需预先声明即可使用,初始值为空字符串或零。
定义与使用变量 #
这个 AWK 脚本定义了两个变量,执行步骤如下:
BEGIN { x = 10; y = 20; print "Sum:", x + y }
-
BEGIN
代码块:BEGIN
是 AWK 中的特殊模式,会在处理任何输入前执行,通常用于初始化任务。 -
变量赋值:在 BEGIN
代码块中,两个变量x
和y
分别被赋值为10
和20
。 -
打印语句: print
命令输出字符串"Sum:"
后接表达式x + y
的结果,即x
与y
的和。
在脚本中修改变量 #
这个 AWK 脚本会修改变量。它执行以下步骤:
{ count += 1; total += $2 }
END { print "Total records:", count; print "Sum of column 2:", total }
-
主代码块(
{ ... }
):
-
该代码块会对输入的每一行执行操作。 -
count += 1
:每处理一行就将count
变量增加1
,这实际上是在统计输入中的总记录数(行数)。 -
total += $2
:将当前行第二个字段(列)的值累加到total
变量中,用于计算第二列所有数值的累计总和。 -
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 脚本中,你可以使用 if
、for
和 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 支持多种算术运算:
基本算术运算符 #
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
一元算术运算符 #
|
|
---|---|
|
|
|
|
自增和自减运算符 #
|
|
---|---|
|
|
|
|
|
|
|
|
赋值运算符 #
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
常见问题 #
关于该主题最常见的问题及简洁易懂的解答:
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命令速查清单表
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论