awk从0学习,这一篇就够了

awk从0学习,这一篇就够了
最新回答
你们不会忘记我

2022-08-09 14:42:49

Awk是一种强大的文本处理工具,适用于处理结构化数据,例如表格数据。 它能够读取一个或多个文本文件,并执行模式扫描和处理等指定的操作。Awk的基本逻辑涉及数据的提取、排序和计算,并支持复杂的条件语句。

  • 安装与运行:Awk通常预装在大多数Linux系统中,无需额外安装。

  • 基本字段解析

    $0 表示当前行,$1 到 $n 表示指定字段。

    NR 表示当前行数,从1开始。

    NF 表示当前记录字段个数。

    示例:打印每行的字段数和内容:awk '{print "Number of fields:"NF, "Content:"$0}' output.txt。

  • 基本语法

    读取文件并打印指定的字段,例如:echo "nihaoshijie" | awk '{print $2, $1}'。

  • 字符串格式化

    格式符由 % 字符开始,后跟一个或多个字符,用于指定输出的格式。常用的格式说明符包括 %s(字符串)、%d(十进制整数)、%f(浮点数)、%c(字符)等。

    示例:%-10s 指一个宽度为10个字符(-表示左对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

  • 基本操作

    打印和格式化输出

    使用 print 打印文本,例如:打印每行的第3个和第6个字段:awk '{print $3, $6}' output.txt。

    使用 printf 格式化输出,例如:格式化输出每行的第3个和第6个字段:awk '{printf "Name:%s, Score:%dn", $3, $6}' output.txt。

    内置变量

    FS:字段分隔符,默认是空格。例如:设置字段分隔符为逗号:awk 'BEGIN{FS=","}{print $1, $2}' output.txt。

    OFS:输出字段分隔符。例如:设置输出字段分隔符为制表符:awk 'BEGIN{OFS="t"}{print $1, $2}' output.txt。

    RS:输入记录的分隔符,默认是换行符 n。

    ORS:输出记录的分隔符,默认也是换行符 n。例如:修改记录的输入输出分隔符:awk -vRS="nn" -vORS="nn" '{print $0}' output.txt。

  • 模式与动作

    模式匹配

    使用正则表达式进行模式匹配,例如:匹配包含 "error" 的行:awk '/error/{print}' logfile.txt。

    使用条件表达式进行模式匹配,例如:匹配第三个字段大于50的行:awk '$3>50{print}' output.txt。

    动作

    学习常见的动作,如 print、if-else、for、while 等。例如:使用 if-else 进行条件判断:awk '{if ($3 > 50) print $1, $3; else print $1, "Fail"}' output.txt。

    结合模式和动作处理更复杂的任务,例如:使用模式和动作过滤并处理数据:awk '/error/ {count++} END {print "Number of errors:", count}' logfile.txt。

  • 进阶操作

    内置函数

    学习Awk内置函数,如 gsub、sub、length、substr、split 等。例如:使用 gsub 替换字符串中的空格为下划线:awk '{gsub(/ /, "_", $0); print}' input.txt。

    练习使用这些函数进行字符串和数字的处理,例如:计算每行字符串的长度:awk '{print $0, "Length:", length($0)}' input.txt。

    用户自定义函数

    学习如何定义和调用自定义函数,例如:定义一个函数计算平方:awk 'function square(x) {return x * x} {print $1, square($1)}' input.txt。

    编写一些简单的自定义函数以解决特定问题。

    数组与关联数组

    学习如何使用数组和关联数组,例如:使用数组统计单词出现次数:awk '{for (i=1; i<=NF; i++) word[$i]++} END {for (w in word) print w, word[w]}' input.txt。

  • 实战案例展示

    提取日志文件中访问次数最多的IP地址:

    awk '{ip[$1]++} END {for (i in ip) if (ip[i] > max) {max = ip[i]; max_ip = i} print "Most frequent IP:", max_ip, "with", max, "visits"}' access.log

    计算CSV文件中每列的平均值:

    awk -F, '{for(i=1; i<=NF; i++) sum[i] += $i} END {for(i=1; i<=NF; i++) print "Column", i, "Average:", sum[i]/NR}' data.csv

    从文本文件中提取特定模式的行并统计出现次数:

    awk '/pattern/ {count++} END {print "Pattern found:", count, "times"}' file.txt

    过滤CSV文件中某一列满足特定条件的行:

    awk -F, '$3 > 100 {print}' data.csv

    合并多个CSV文件并计算总和:

    awk -F, '{for(i=1; i<=NF; i++) sum[i] += $i} END {for(i=1; i<=NF; i++) print "Column", i, "Sum:", sum[i]}' file1.csv file2.csv

    按列统计文本文件中每个单词的频率:

    awk '{for(i=1; i<=NF; i++) freq[$i]++} END {for(word in freq) print word, freq[word]}' text.txt

    处理日志文件,计算每小时的访问量:

    awk '{split($4, datetime, ":"); hour=datetime[2]; count[hour]++} END {for(hour in count) print hour, count[hour]}' logfile.txt

    统计文本文件中最长的行及其长度:

    awk '{if(length($0)>max_length){max_length=length($0);longest_line=$0}}END{print "Longest line:", longest_line, "Length:", max_length}' text.txt

    计算一个CSV文件中某列的标准差:

    awk -F, '{sum+=$3;sumsq+=$3*$3}END{print "Standard Deviation:", sqrt(sumsq/NR-(sum/NR)2)}' data.csv