awk 是一个强大的文本处理工具,它特别擅长对文本文件行列筛选。
基本语法:
awk [options] 'pattern { action }' files
- [options]:awk 的命令行选项,例如 -F 用于指定字段分隔符。
- pattern:指定一个模式,awk 会根据这个模式来选择哪些行执行动作。如果没有指定模式,awk 会默认对所有行执行动作。
- { action }:当行匹配模式时执行的动作(一组命令),通常包括打印语句或其他文本处理命令。
- files:输入文件,如果没有指定文件,则从标准输入(stdin)读取。
常用选项和命令:
-
-F:指定字段分隔符,默认为空白字符(空格或制表符)。
awk -F, '{print $1}' file.csv # 使用逗号作为字段分隔符
-
BEGIN 和 END:在处理任何行之前(BEGIN)和之后(END)执行的块。
awk 'BEGIN {print "Start Processing"} {print} END {print "End Processing"}' file.txt
-
$1, $2, ...:访问当前记录的字段,$0 表示整行。
awk '{print $1, $3}' file.txt # 打印每行的第一个和第三个字段
-
NR:当前记录的行号。
awk 'NR > 10 {print}' file.txt # 打印文件的第11行及之后的行
-
gsub 和 sub:全局和单个字符串替换函数。
awk '{sub(/foo/, "bar"); print}' file.txt # 将每行中的 "foo" 替换为 "bar"
-
split:将字符串分割为数组。
awk '{split($2, a, ":"); print a[1], a[2]}' file.txt # 假设 $2 包含 "user:score" 形式的字符串
-
printf:格式化输出。
awk '{printf "Name: %s, Score: %d\n", $1, $3}' scores.txt
-
条件语句:根据条件执行不同的动作。
awk '{if ($3 > 90) print "High Score:", $0}' file.txt # 如果第三个字段大于90,则打印整行
-
for 循环和数组操作。
awk '{for (i = 1; i <= NF; i++) print $i}' file.txt # 打印每行的每个字段
-
系统命令:在 awk 动作中执行系统命令。
复制
awk '{print $1}' file.txt | sort | uniq -c # 打印文件中每个唯一字段的数量
awk 的功能非常强大,可以执行复杂的文本处理任务,包括文本分析、数据提取、报告
应用场景
awk 是一个功能丰富的文本处理工具,它在Unix和类Unix系统中被广泛用于文本和数据处理。awk 以其高效的模式扫描和处理能力而著称,适用于各种复杂的文本操作任务。以下是一些典型的 awk 应用场景:
数据提取
从日志文件或数据文件中提取特定字段。例如,从日志中提取访问IP和访问时间:
awk '/Access from/ {print $1, $3}' access.log
报告生成
根据文本文件内容生成格式化的报告。例如,生成用户活动报告:
awk '{print $3, $7}' /var/log/wtmp > activity_report.txt
数据统计
对文本文件中的数据进行统计和汇总。例如,计算某个值的出现次数:
awk '{count[$2]++} END {for (i in count) print i, count[i]}' file.txt
文本替换和转换
在文件中查找并替换文本,或将文本从一种格式转换为另一种格式。例如,将所有逗号分隔的值转换为制表符分隔:
awk -F, '{for(i=1; i<=NF; i++) printf("%s\t", $i); print ""}' file.csv > file.tsv
条件筛选
根据特定条件筛选文本行。例如,筛选出所有大于某个阈值的记录:
awk '$5 > 100' data.txt
数据排序
对文本文件中的数据进行排序。例如,按第二列的数值排序:
awk '{print $2}' file.txt | sort -n
交互式文本处理
在脚本中使用 awk 进行交互式文本处理,如读取用户输入并动态生成输出:
awk 'BEGIN {printf "Enter a number: "} {sum += $1} END {print "Sum: " sum}'
多级数据处理
同时处理多个输入文件,并对它们进行比较、合并或其他操作:
awk -F'\t' 'NR==FNR {a[$1]=$2; next} $1 in a {print $1, a[$1], $2}' file1.txt file2.txt
格式化输出
生成格式化的输出,如添加标题、列宽和边框:
awk 'BEGIN {print "Name", "Score"; print "-----", "-----"} {print $1, $2}' scores.txt
脚本编程
在复杂的脚本中使用 awk 进行文本处理,与其他命令和工具结合使用:
复制
cat file.txt | awk '{print $0}' | sort | uniq -c | sort -nr > sorted_report.txt
工作场景
awk 在日常工作中有许多实用的应用场景,特别是在处理和分析文本数据方面。以下是一些典型的 awk 工作场景:
1. 日志文件分析
分析Web服务器、系统日志或其他日志文件,提取和汇总关键信息,如访问次数、错误类型、用户活动等。
awk '/404/ {count["404"]++} END {for (error in count) print error, count[error]}' access.log
2. 数据报告生成
从原始数据文件中生成格式化的报告,包括列标题、合计行和汇总统计。
awk 'NR>1 {print $1, $2, $3, $4}' data.txt | column -t
3. 配置文件处理
批量修改配置文件中的参数,例如,更新所有用户的配额限制。
awk '$1 == "User" {$2 = "newlimit"} 1' config.txt > new_config.txt
4. 文本数据转换
将数据从一种格式转换为另一种格式,例如,将CSV文件转换为TSV文件。
awk -F, 'NF {for (i=1; i<=NF; i++) printf("%s\t", $i); print ""}' file.csv > file.tsv
5. 数据清洗和预处理
清洗文本数据,移除无用的行或列,或者标准化数据格式。
awk 'NR==1 || $1 !~ /#/ {print}' data.txt # 移除以#开头的注释行
6. 脚本自动化
在shell脚本中使用awk来自动化复杂的文本处理任务,如日志轮转、数据备份等。
awk '{print $4}' access.log | xargs -I {} mv {} {}.bak
7. 临时更改配置
在不修改原始配置文件的情况下,临时更改配置参数进行测试。
awk '$1 == "MaxClients" {$2 = "500"} 1' httpd.conf > temp.conf && source temp.conf
8. 数据库和CSV文件操作
处理数据库导出的CSV文件,执行数据选择、过滤和聚合操作。
awk -F, '$2 == "success" {sum += $3} END {print sum}' transactions.csv
9. 用户输入处理
在交互式脚本中使用awk来处理用户输入,动态生成报告或执行其他任务。
read -p "Enter a number: " num
awk -v var=$num '$1 ~ var {print $0}' data.txt
10. 系统监控和警报
监控系统日志或性能数据,实时生成警报或通知。
复制
awk '/error/ {print}' /var/log/messages | mail -s "System Alert" [email protected]
标签:文本,文本处理,awk,file,linux,print,txt,三剑客
From: https://blog.csdn.net/m0_63436163/article/details/137237407