前言:linux环境准备
因为学习的时候是windows环境,没有linux环境很不方便。找到一个在线的linux环境分享给大家。
同时也为豆包的AI产品点赞。
免费在线linux环境参考:Linux 在线练习 | 菜鸟教程
AWK的基本结构
awk -option 'pattern {action}' file.txt
第一章 内置变量
$0
:当前行的完整内容。$1, $2, ...
:当前行的第1个字段、第2个字段等。NF
:当前行的字段数。NR
:当前行号(从1开始)。FS
:字段分隔符,默认为空白字符(空格或制表符)。OFS
:输出字段分隔符,默认为空白字符。ORS
:输出记录分隔符,默认为换行符。
Built-in Variables (The GNU Awk User’s Guide)
练习题目:输出文件中第10行内容
awk 'NR==10' file.txt
第二章 模式
2.1 整行查找模式
查找文件中以begin开头,end结尾的行数据。
awk '/^begin end$/' file.txt
示例代码:
cat employee.txt
ajay manager account 45000 sunil clerk account 25000 varun manager sales 50000 amit manager account 47000 tarun peon sales 15000 deepak clerk sales 23000 sunil peon sales 13000 satvik director purchase 80000
awk '/manager/{print $0}' employee.txt
ajay manager account 45000 varun manager sales 50000 amit manager account 47000
区间查找。查找文件中begin1开头的数据行至end2结尾的数据行。
awk '/^begin1/,/end2$/' file.txt
示例代码:查找manager开始,到clerk结束的行数据。
awk '/manager/,/clerk/' employee.txt
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
2.2 列数据查找
awk '$1 ~ /^begin end$/' file.txt
查找第一列中满足正则式条件的所有行数据。
示例代码:查找第一列中名字为varun的行数据。
awk '$1 ~ /varun/' employee.txt
varun manager sales 50000
awk '/^(\([0-9]{3}\) [0-9]{3}\-[0-9]{4}|[0-9]{3}\-[0-9]{3}\-[0-9]{4})$/' file.txt
说明:本题目在marscode在线linux环境中测试容易得到错误的结果,所以在windows环境下还是建议安装真实的linux环境。
使用Windows Subsystem for Linux运行,请移步文章:
Win11安装基于WSL2的Ubuntu - charlee44 - 博客园
第三章 动作
3.1 单个动作
awk '/pattern/{print $1,$2}' file.txt
对满足正则式条件的行执行{action}操作。
3.2 多个动作
awk 'NR == 1 {print $0} NR == 2 {print $0}' file.txt # 打印前两行
3.3 初始化和结尾动作
BEGIN块:
BEGIN
块在awk开始处理任何输入之前执行。- 通常用于初始化变量、打印表头信息,或者执行需要在读取实际数据前完成的操作。
- 示例用法:
BEGIN { print "Processing started at:", systime() FS = "," # 设置字段分隔符 OFS = "\t" # 设置输出字段分隔符 }
END块:
END
块在awk处理完所有输入行之后执行。- 它常用来做最终的计算(如统计总数)、汇总输出或者在所有处理完成后进行操作。
- 示例用法:
NR > 0 { sum += $3 } # 对第三列求和(假设每一行都有第三列) END { print "Total sum of third column:", sum print "Number of processed lines:", NR }
结合上述示例,在一个完整的awk脚本中,BEGIN块首先执行,然后逐行处理输入数据,最后执行END块。这为编写预处理和后处理逻辑提供了一种方便的方式。
awk 'BEGIN {print "Start"} {print $0} END {print "End"}' file.txt
awk '{
for (i=1; i<=NF; i++)
words[$i] = words[$i] + 1
}
END{
for (word in words)
print word,words[word]
}' words.txt | sort -rn -k 2
第四章 数组
awk中数组本质存储的是key=value对数据,所以key可以不连续,与Java里的map比较类似。
4.1 判断key是否在数据中存在
判断数组中key是否存在使用表达式 indx in array 返回值true/false来确定。
Reference to Elements (The GNU Awk User’s Guide)
4.2 遍历数组
Scanning an Array (The GNU Awk User’s Guide)
4.3 删除数组中元素
Delete (The GNU Awk User’s Guide)
# Read from the file file.txt and print its transposed content to stdout.
awk '{
for (i=1; i<=NF; i++)
if (NR==1)
cols[i] = $i
else
cols[i] = cols[i] " " $i
}
END{
for (var in cols)
print cols[var]
}
' file.txt
参考资料
官方文档:GNU Awk User's Guide
书籍:《Awk Programming: A Quick Guide》