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}'
    
posted @   ヾ(o◕∀◕)ノヾ  阅读(20)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示