linux中awk 详解。
2025-09-20 23:13
Linux
137
0
0
0
标题录入
封面图
在 Linux 中,`awk` 是一个非常强大、灵活的文本处理工具。它主要用于**按行处理文本文件**,支持条件判断、变量操作、字符串处理、数学运算等,是数据提取和报告生成的利器。 --- ## 一、什么是 `awk`? `awk` 是一种 **编程语言**,最初由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在 1970 年代开发,因此得名 `awk`(取自三人的名字首字母)。 它最常用于: - 提取文本中的特定字段 - 数据统计 - 格式化输出 - 条件过滤 --- ## 二、基本语法 ```bash awk 'pattern { action }' file ``` - `pattern`:匹配条件(可选) - `action`:执行的操作(可选) - `file`:输入文件(可选) 如果没有指定文件,则从标准输入读取。 --- ## 三、基本用法示例 ### 1. 打印整个文件内容 ```bash awk '{ print }' filename.txt ``` ### 2. 打印第一列(默认以空格或制表符分隔) ```bash awk '{ print $1 }' filename.txt ``` ### 3. 打印第二列 ```bash awk '{ print $2 }' filename.txt ``` ### 4. 打印第 3 到第 5 列 ```bash awk '{ for (i=3; i<=5; i++) printf "%s ", $i; print "" }' filename.txt ``` ### 5. 打印每一行的行号和内容 ```bash awk '{ print NR, $0 }' filename.txt ``` > `NR` 表示当前记录号(行号),`$0` 表示整行内容。 --- ## 四、字段分隔符(FS) 默认使用空格或制表符作为分隔符,可以自定义: ```bash awk -F',' '{ print $1, $2 }' filename.csv ``` > `-F` 指定字段分隔符为逗号。 --- ## 五、条件判断 ### 1. 匹配某一行 ```bash awk '/pattern/ { print }' filename.txt ``` 例如: ```bash awk '/error/ { print }' log.txt ``` ### 2. 基于字段值判断 ```bash awk '$3 > 100 { print $0 }' data.txt ``` 表示打印第三列大于 100 的行。 --- ## 六、内置变量 | 变量 | 说明 | |------|------| | `NF` | 当前行的字段数 | | `NR` | 当前行号(记录号) | | `FS` | 字段分隔符(默认是空格) | | `RS` | 记录分隔符(默认是换行符) | | `OFMT` | 输出格式,默认是 `%g` | | `ORS` | 输出记录分隔符,默认是 `\n` | --- ## 七、函数 ### 1. `length()` 获取字符串长度 ```bash awk '{ print length($0) }' filename.txt ``` ### 2. `substr()` 截取子串 ```bash awk '{ print substr($0, 1, 5) }' filename.txt ``` ### 3. `split()` 分割字符串 ```bash awk '{ split("apple,banana,cherry", fruits, ","); for (i in fruits) print fruits[i] }' ``` --- ## 八、流程控制语句 ### 1. if 语句 ```bash awk '{ if ($3 > 100) print "High value: " $0 else print "Low value: " $0 }' data.txt ``` ### 2. for 循环 ```bash awk '{ for (i = 1; i <= NF; i++) printf "%s ", $i print "" }' filename.txt ``` ### 3. while 循环 ```bash awk '{ i = 1; while (i <= NF) printf "%s ", $i++; print "" }' filename.txt ``` --- ## 九、BEGIN 和 END 块 ### 1. `BEGIN`:在处理文件前执行 ```bash awk 'BEGIN { print "Start of processing" } { print $0 }' filename.txt ``` ### 2. `END`:在处理完所有行后执行 ```bash awk 'END { print "End of processing" }' filename.txt ``` --- ## 十、常见应用场景 ### 1. 统计文件中单词数量 ```bash awk '{ words += NF } END { print "Total words:", words }' filename.txt ``` ### 2. 统计文件中行数 ```bash awk 'END { print NR }' filename.txt ``` ### 3. 按照某个字段排序并去重 ```bash sort filename.txt | uniq | awk '{ print $1 }' ``` ### 4. 提取日志中的错误信息 ```bash grep 'ERROR' log.txt | awk '{ print $1, $2, $3 }' ``` --- ## 十一、高级功能(GNU awk) GNU `awk`(也叫 `gawk`)支持更强大的功能: - 正则表达式匹配 - 自定义函数 - 数组操作 - 多维数组 - 与 shell 脚本结合使用 --- ## 十二、总结 | 功能 | 示例 | |------|------| | 打印所有行 | `awk '{ print }' file` | | 打印第一列 | `awk '{ print $1 }' file` | | 按字段筛选 | `awk '$3 > 100' file` | | 自定义分隔符 | `awk -F',' '{ print $1 }' file` | | BEGIN/END 块 | `awk 'BEGIN { print "Start" } END { print "End" }' file` | | 条件判断 | `awk ' $3 > 100 { print $0 }' file` | --- ## 十三、参考文档 - `man awk` - `info gawk` (查看 GNU awk 的详细文档) - [https://www.gnu.org/software/gawk/manual/gawk.html](https://www.gnu.org/software/gawk/manual/gawk.html) --- 如果你有具体的使用场景或者需要写一个 `awk` 脚本,我可以帮你写出完整的命令!
上一篇:
linux怎么对命令进行取别名?
下一篇:
linux查看文件内容有哪些命令可以使用?
标题录入,一次不能超过6条
为什么赌博的人都相信自己会赢?
T:0.004642s,M:122.94 KB
返回顶部
留言
留言
评论