awk基础及举例
AWK内置变量
- $0 - 当前记录,指所有字段
- ARGC - 命令行参数个数
- ARGIND - 当前文件在ARGV中的索引值
- ARGV - 命令行参数数组
- ENVIRON - 环境变量数组
- FILENAME - 当前文件名
- FNR - 当前记录数
- FS - 字段分隔符,默认是空格
- NF - 当前记录的字段数
- NR - 当前行数
- OFMT - 输出格式,默认是%.6g
- ORS - 输出记录分隔符,默认是换行符
- RS - 记录分隔符,默认是换行符
AWK常用参数
- -F - 指定分隔符
- -v - 定义变量
- -f - 指定文件读取awk代码
- -o - 优化Awk程序以提高性能
- -W - 兼容旧版本
- -r - 启用扩展正则表达式中的重复操作符
AWK内置函数
- 字符串函数
- length(str): 返回字符串 str 的长度。
- index(str, search): 返回字符串 str 中第一次出现 search 的位置。
- substr(str, start, length): 返回字符串 str 中从 start 开始长度为 length 的子字符串。
- split(str, arr, sep): 将字符串 str 按照分隔符 sep 分割,并将结果存储到数组 arr 中。
- tolower(str): 将字符串 str 转换为小写。
- toupper(str): 将字符串 str 转换为大写。
- gsub(r, s [, t]): 在字段t中用s替换正则表达式r的所有匹配项。
- sub(r, s): 单个替换。
- match(s, r): 返回字符串s中正则表达式r的第一个最长匹配项的索引。
- sprintf(format, expr, ...): 返回一个格式化字符串。
- 数值函数
- int(n): 返回 n 的整数部分。
- sqrt(n): 返回 n 的平方根。
- sin(n): 返回 n 的正弦值。
- cos(n): 返回 n 的余弦值。
- rand(): 返回一个 0 到 1 之间的随机数。
- srand([Expr]): 设置随机数生成器的种子。
- atan2(y, x): 返回y/x的反正切值。
- exp(x): 返回e的x次幂。
- log(x): 返回x的自然对数。
AWK控制语句
- 条件控制
- if (条件) {代码块} else
- 循环控制
- for (i=1; i<=10; i+=1)
- while (条件为真)
- do {代码块} while (条件为真)
- continue:跳出当前循环
- break:跳出整个循环
- exit:终止整个Awk程序
AWK举例
-
以“,”为分隔符,匹配包含“abc”的行,输出第一列和第二列
awk -F ',' '/c/{print $1, $2}' a.txt
-
变量赋值
awk -v num=100 'BEGIN{print "number is", num}'
-
管道符
seq 10 |awk '$1 > 5 && $1 < 9'
-
输出第1行
awk 'NR==1{print}' a.txt
-
输出最后1行
awk 'END{print}' a.txt
-
输出第2~4行
awk 'NR>=2 && NR<=4' a.txt
-
输出倒2行
awk '{ line[NR] = $0 } END { print line[NR-1] }' a.txt // 将每一行的内容存储在名为line的数组中,数组的索引为当前行号NR // 打印存储在数组line中倒数第二行的内容
-
输出第1、3、5行
awk 'NR==2 || NR==6 || NR==8' a.txt
-
每隔3行输出一次
awk 'NR % 3 == 0' a.txt
-
不输出空行
awk 'NF' a.txt
-
输出包含'c'的行和下一行
awk '/c/ {print; getline; print}'
-
输出第列1为2,第2列小于50000的行
awk '$1==2 && $2<50000{print}' a.txt
-
模糊匹配第1列以“2”开头的行
awk '$1 ~ /^2/' a.txt
-
输出倒数第二列、最后一列
awk '{print $(NF-1), $NF}' a.txt
-
不输出第3列和最后1列
awk '{$3=""; $NF=""; print}' a.txt
-
在最后添加一列字符串
awk '{print $0, "aaa"}' a.txt
-
输出2~3行的第1列
awk 'NR>1 && NR<4{print $1}' a.txt
-
输出前3行,不包含最后1列
awk -F , 'NR<4{$NF=""; print}' a.txt
-
输出每行的行号
awk '{print NR, $0}' a.txt
-
输出匹配行的行号及内容
awk '/c/{print NR, $0}' a.txt
-
输出包含关键字的总行数
awk '/c/ {n++} END {print n}' a.txt
-
输出总行数
awk 'END{print NR}' a.txt
-
遍历所有列
awk '{for (i=1; i<=NF; i++) print "第" NR "行," "第" i "列:" $i}' a.txt
-
获取每行的列数
awk -F , '{print "第" NR "行, 共" NF "列: ", $0}' a.txt
-
忽略大小写(IGNORECASE=1)
awk 'BEGIN{IGNORECASE=1} /c/' a.txt
-
OFS 指定输出分隔符(默认是空格)
awk '{OFS="/";print $1, $2, $3}' a.txt
-
awk也支持正则
awk '/a(b|d)+c/' a.txt awk '!/[0-9]/' a.txt
-
判断数字大小
awk '{if ($1 < 18) print $1 "岁,未成年" ;else print $1 "岁,已成年"}'
-
对比两份不同文件,取出相同行
awk 'FNR==NR {a[$0];next} $0 in a {print $0}' a.txt b.txt
-
多分支判断,没有elif,通过else if构造(判断第1列的值为4、6、9)
# vim test.awk { if($1==4) {print "yes"} else if($1==6) {print "yes"} else if($1==9) {print "yes"} else {print "no(" $1 ")"} }
-
三元表达式
# vim test.awk { label = ($2 < 60) ? "不及格": ($2 < 71) ? "及格": ($2 < 85) ? "良好": ($2 < 101) ? "优秀": "分数超出范围" print $1, label } awk -f test.awk a.txt
-
for 循环
awk 'BEGIN{for (i=0; i<=5; i+=1) {print i}}'
-
跳出循环
// 如果i=2,跳出当前循环;如果i=6,跳出整个循环 awk 'BEGIN{for (i=1; i<=10; i+=1) {if (i==2) {continue}; if (i==6) {break}; print "循环" i}}'
-
while 循环
awk 'BEGIN{i=0; while (i<10) {i++; if (i==2) {continue};if (i==6) {break};print i}}'
-
全部转换为大写
awk '{print toupper($0)}' a.txt
-
全部转换为小写
awk '{print tolower($0)}' a.txt
-
单词首字母大写其余小写
awk '{for (i=1;i<NF;i++){$i=toupper(substr($i,1,1))tolower(substr($i,2))}print}' a.txt
-
浮点数取整
awk '{print int($1)}'
-
构造随机数
awk 'BEGIN{srand(); print rand()}'
-
生成100~200的随机数
awk 'BEGIN{srand(); print int(rand()*101) + 100}'
-
生成6位数随机数
awk 'BEGIN{srand(); printf "%06d\n", int(rand()*1000000)}'
-
生成1000w行简单数据
awk 'BEGIN { for (i=1; i<=10000000; i++) print "abc" }'
-
生成1GB简单数据
awk 'BEGIN{w=0; while (w<1) {print "abc"}}' |head -c 1G
-
求和
awk '{sum += $1} END{print sum}'
-
求平均
awk '{sum += $1} END{print sum/NR}'
-
求最大值
awk 'NR==1{max=$1} $1>max{max=$1} END{print max}'
-
求最小值
awk 'NR==1{min=$1} $1<min{min=$1} END{print min}'
本文来自博客园,作者:ヾ(o◕∀◕)ノヾ,转载请注明原文链接:https://www.cnblogs.com/Jupiter-blog/p/18332070
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)