linux下awk的典型用法示例

本文介绍如何使用awk命令从/etc/passwd文件中筛选特定的行,包括匹配特定用户、列条件和执行复杂操作。通过一系列示例展示awk的强大功能,帮助用户高效地处理和分析文件数据。

打印包含root的行

awk -F":" '{if($1~/root/) print $1}' /etc/passwd

匹配root,并打印第一列

awk -F":" '/root/{print $1}' /etc/passwd   

打印第四列等于100的行

awk -F":" '$4==100 {print $0}' /etc/passwd  

打印不包含root的行

awk -F":" '$1 !~ /root/ {print $0}' /etc/passwd   

打印第一列不等于root的行

awk -F":" '$1 != “root” {print $0}' /etc/passwd  

如果第三列小于第四列,则打印此行

awk -F":" '$3 < $4 {print $0}' /etc/passwd  

匹配两列之和为155

awk -F":" '$3 + $4 == 155 {print $0}' /etc/passwd   

打印两列相加结果

awk -F":" ' {print $3,$4,"Total is:"$3 + $4 }' /etc/passwd  

区配某字段

awk '/[Rr]oot/' /etc/passwd  

抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/ ^ . . . a /意为行首前三个字符任意,第四个是a,尖角符号代表行首

awk '/^...s/' /etc/passwd     

匹配包含root或net或ucp的任意行

awk '/(root|net|ucp)/' /etc/passwd   

匹配以数字开头的行

awk '/^[0-9]/' group.txt     

打印0-10之间的行

awk 'NR>0 && NR<10{print NR,$0}' passwd 

打印大于7列的行

awk -F: 'NF>7 {print NF,$0}' passwd  

如果第31行超过8列,就打印这一行的第1列

awk -F: '{if (NF==8 && NR==31)print NR,$1}' passwd  

将包含/root的字段替换为admin

awk 'gsub(/root/,"admin") {print $0}' passwd 

如果第一列长度为4则打印此行

awk -F: 'length($1)==4 {print $0,length($1)}' passwd   

将命令传给awk

awk '$3==day {print $0}' day=`date +%d` /tmp/te.log   
<think> 我们正在讨论的是Linux系统中的awk命令使用方法。根据用户提供的参考资料,我们可以系统地介绍awk用法。 注意:用户要求使用特定格式回答,包括数学表达式的格式,以及生成相关问题。同时,需要参考之前提供的引用内容。 回答结构: 1. 介绍awk的基本概念和用途。 2. 详细讲解awk的基本语法和核心概念(内置变量、分隔符、BEGIN和END块)。 3. 常见用法示例(基础打印、条件过滤、计算与统计、字符串操作、处理CSV文件)。 4. 高级用法(数组统计、多条件分支、结合外部命令、自定义函数)。 5. 实战场景示例(分析Nginx访问日志、提取特定时间段日志、生成格式化报告)。 6. 常用技巧和性能优化。 7. 生成相关问题。 注意:在回答中使用LaTeX格式的数学表达式(如果有的话),但根据内容,awk中可能较少涉及数学公式,但如果有计算类的内容,我们按照要求书写。 另外,在适当的地方添加引用标记(如[^1]、[^2]等),这些引用标记对应到用户提供的引用内容。 由于用户提供了多个引用,我们在讲解时会参考引用内容,并在相关位置标注。 开始回答: </think> ### Linux 系统 awk 命令使用详解 awkLinux 文本处理的「三剑客」之一(与 sed/grep 齐名),专精结构化数据提取与统计。核心原理是**逐行扫描文件,按规则处理字段**,以下是系统级使用指南: --- #### **一、基础语法结构** ```bash awk [选项] '模式 {动作}' 文件名 ``` - **模式**:行筛选条件(如 `$2>10`) - **动作**:处理命令(如 `{print $1,$3}`) - **常用选项**: `-F` 指定分隔符(默认空格/Tab) `-v` 定义变量(如 `-v OFS="|"` 设置输出分隔符)[^2][^3] --- #### **二、核心概念及操作** 1. **内置变量** | 变量 | 含义 | 示例 | |------|-----------------------|--------------------------| | `NR` | 当前行号 | `awk '{print NR,$0}'` | | `NF` | 当前行列数 | `awk '{print $NF}'` | | `FS` | 输入字段分隔符 | `BEGIN{FS=":"}` | | `OFS`| 输出字段分隔符 | `BEGIN{OFS="-"}` | | `FILENAME` | 当前文件名 | `END{print FILENAME}` | 2. **BEGIN/END 块** - 预处理:`BEGIN{}` 在读取文件前执行(如初始化变量) - 后处理:`END{}` 在文件处理后执行(如汇总统计)[^4] ```bash awk 'BEGIN{sum=0} {sum+=$3} END{print "总和:" sum}' data.txt ``` 3. **多分隔符处理** ```bash # 同时识别空格/斜线/冒号为分隔符(连续视为一个) echo "id:100 /name=john" | awk -F '[: /=]+' '{print $2,$4}' # 输出:100 john ``` 此技巧常用于日志解析(如 Nginx/IP 命令输出)[^3] --- #### **三、高频使用场景示例 ▎1. 基础字段提取 ```bash # 提取 /etc/passwd 的用户名和 UID awk -F: '{print $1 "的ID是:" $3}' /etc/passwd # 输出第2列大于10的行(逗号输出用OFS分隔) awk -v OFS=" | " '$2 > 10 {print NR, $1,$2}' data.txt ``` ▎2. 条件过滤与计算 ```bash # 统计CPU使用率>80%的进程数量 ps aux | awk '$3 > 80 {count++} END{print count}' # 计算文件总大小(第5列为大小) ls -l | awk 'BEGIN{sum=0} {sum+=$5} END{print sum/1024 "KB"}' ``` ▎3. 字符串操作 ```bash # 替换字段内容(将第2列的old替换为new) awk '{gsub("old","new",$2); print}' file.txt # 提取IP地址(匹配数字+点号格式) ip a | awk '/inet / {match($2,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); print substr($2,RSTART,RLENGTH)}' ``` ▎4. 日志分析实战 ```nginx # Nginx日志格式:172.17.0.1 - - [05/May/2023:10:30:22 +0800] "GET /api HTTP/1.1" 200 612 ``` ```bash # 统计每小时请求量 awk -F'[: ]' '{count[$3]++} END{for(h in count) print h "时: " count[h] "次"}' access.log # 提取特定时间段日志(10:30-11:30) awk -F'[: ]' '$3=="10" && $4>=30 || $3=="11" && $4<=30' access.log ``` --- #### **四、高级技巧** 1. **数组统计** ```bash # 统计单词频率(忽略大小写) awk '{for(i=1;i<=NF;i++) count[tolower($i)]++} END{for(word in count) print word, count[word]}' text.txt ``` 2. **多分支逻辑** ```bash awk '{ if ($3 >= 90) grade="A"; else if ($3 >= 80) grade="B"; else grade="C"; print $1, grade }' scores.txt ``` 3. **性能优化建议** - 大文件处理时避免 `print $0`,明确指定输出字段 - 使用 `next` 跳过无关行(如 `/error/ {print; next}`) - 复杂操作优先用内置函数(如 `gsub()` 比管道 `sed` 高效) --- ### 相关问题 1. 如何用 `awk` 实现两个文件的关联查询? 2. `awk` 如何处理带换行符的 JSON 日志? 3. `awk` 与 `Python` 处理 GB 级文本的性能对比? 4. 如何用 `awk` 生成 HTML/CSV 格式报告? > 深入学习:执行 `man awk` 或参考 [GNU Awk 手册](https://www.gnu.org/software/gawk/manual/)。实战案例可延伸阅读《Shell脚本学习指南》[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值