Fundamentals 19 min read

Master awk: From Basics to Powerful Text Processing in Linux

This comprehensive guide explains what awk is, how to learn it, its syntax of patterns and actions, built‑in variables like NR and NF, and provides practical examples and interview‑style exercises for mastering text processing on the Linux command line.

Raymond Ops
Raymond Ops
Raymond Ops
Master awk: From Basics to Powerful Text Processing in Linux

awk是什么

awk是一个强大的Linux命令,具备强大的文本格式化能力,类似于将文本数据格式化成专业的Excel表格样式。awk最早在Unix上实现,我们使用的版本是gawk,即GNU awk。

如何学awk

学习awk
学习awk

awk的语法格式

awk指令由模式、动作,或模式和动作的组合构成。

模式(pattern)类似于sed的模式匹配,可以是表达式或正则,例如NR==1表示第一行。

动作(action)是一条或多条语句,写在大括号中,例如 {print $0}

awk模式、动作

模式:指要操作哪些行。

动作:找到这些行后执行的处理。

生成测试数据
[242-yuchao-class01 root ~]
#echo cc{01..50} | xargs -n 5
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
cc31 cc32 cc33 cc34 cc35
cc36 cc37 cc38 cc39 cc40
cc41 cc42 cc43 cc44 cc45
cc46 cc47 cc48 cc49 cc50

写入文件,生成测试数据文件
echo cc{01..50} | xargs -n 5 > yuchao.log

无模式、只有动作

直接输出源文件的所有内容,动作是 {print $0} ,其中 $0 表示整行。

字段取值语法: $0 全部字段, $1 第一列, $2 第二列,依次类推。

[242-yuchao-class01 root ~]#awk '{print $0}' test_awk.log
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
...

行变量NR、匹配范围语法

默认处理所有行。

可以指定处理特定行。

# 打印行号和内容
awk '{print NR,$0}' test_awk.log
# 打印第二行全部字段
awk 'NR==2{print $0}' test_awk.log
# 打印第二行的第一列和第四列
awk 'NR==2{print $1,$4}' test_awk.log
# 行范围示例
awk 'NR>=2&&NR<=5{print $0}' test_awk.log

列变量NF、每一列的字段

# 查看每行字段数
awk '{print $0,NF}' test_awk.log
# 打印特定列
awk '{print $1,$2,$3}' test_awk.log
# 打印最后一列
awk '{print $NF}' test_awk.log
# 打印倒数第二列
awk '{print $(NF-1)}' test_awk.log
NF示意图
NF示意图

指定行(模式)、打印动作

awk '模式 {打印动作}'

提取第二行的数据:

awk 'NR==2{print $0}' test_awk.log
# 简写(默认打印$0)
awk 'NR==2' test_awk.log

提取第二行到第五行:

awk 'NR>=2&&NR<=5{print $0}' test_awk.log

提取第二行到第五行并只打印前三列:

awk 'NR>=2&&NR<=5{print $1,$2,$3}' test_awk.log
模式动作示意图
模式动作示意图

只有动作、不写模式

没有模式表示对所有行生效,awk默认处理所有行。

awk '{print $1,$2,$3}' test_awk.log

多个模式和动作(解释NR、NF)

指定行: NR==4 表示第4行。

动作:在大括号中编写。

# 打印行号、字段数和内容(前四行)
awk 'NR<=4{print NR,NF,$0}' test_awk.log

awk快速入门小结

pattern和action都要用单引号,防止shell解释。

不指定模式时,awk默认处理所有行的每一列。

action必须写在花括号里。

面试题,统计单词出现频率

统计文本中单词出现次数并输出出现最多的前5个。

# 使用sed分割单词并统计
sed -r 's#[^a-zA-Z]+#
#g' english.log | sort | uniq -c | sort -r -n | head -5
# 使用tr分割单词并统计
cat english.log | tr ' ' '
' | sort | uniq -c | sort -r -n | head -5
# 使用grep分割单词并统计
grep -E '[a-zA-Z]+' english.log -o | sort | uniq -c | sort -r -n | head -5
# 使用awk分割单词并统计
awk -v RS=' ' '{print $0}' english.log | sort | uniq -c | sort -r -n | head -5

awk列操作(分隔符修改)

默认字段分隔符是空格或制表符,存于变量 FS 。可以使用 -F-v FS='分隔符' 修改。

# 示例:使用冒号分隔 /etc/passwd 并打印用户名和登录shell
awk -v FS=':' '{print $1,$NF}' /etc/passwd
# 修改输出字段分隔符 OFS
awk -v OFS='#' '{print $1,$2,$3,$4,$5}' test_awk.log

修改FS和OFS变量

RS(记录分隔符)决定awk如何分割输入行,默认是换行符。

ORS(输出记录分隔符)决定awk输出行的分隔符,默认是换行符。

FS(字段分隔符)决定输入字段的切割方式,默认是空格。

OFS(输出字段分隔符)决定打印时字段之间的分隔符,默认是空格。

# 将空格改为#作为输出分隔符
awk -v OFS='#' '{print $1,$2,$3,$4,$5}' test_awk.log
# 将冒号改为---并提取特定列
awk -v FS=':' -v OFS='---' 'NR==1{print $1,$(NF-1),$NF}' /etc/passwd

总结行、列

RS、ORS 代表 awk 对行的输入、输出分隔符。

FS、OFS 代表 awk 对列的输入、输出分隔符。

NR 表示当前处理的行号(记录号)。

NF 表示当前行的字段数(列数)。 $1$2 … 用于提取对应列, $NF 表示最后一列。

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

Linuxcommand-lineregextext processingShell scriptingdata manipulationawk
Raymond Ops
Written by

Raymond Ops

Linux ops automation, cloud-native, Kubernetes, SRE, DevOps, Python, Golang and related tech discussions.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.