news 2026/4/22 18:46:54

bash中awk如何切分输出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
bash中awk如何切分输出

在Bash中,使用`awk`切分输出有多种方式。

这里示例几种常见的使用方法。

1 基本字段切割

1.1 按空格/制表符分隔

# 显示第一列
echo "apple banana cherry" | awk '{print $1}'

# 显示第一列和第三列
echo "apple banana cherry date" | awk '{print $1, $3}'

# 显示最后一列
echo "apple banana cherry" | awk '{print $NF}'

# 显示倒数第二列
echo "apple banana cherry date" | awk '{print $(NF-1)}'


1.2 指定分隔符

# 使用 -F 指定分隔符
echo "apple,banana,cherry" | awk -F',' '{print $2}'

# 多个分隔符(正则表达式)
echo "apple;banana:cherry" | awk -F'[;:]' '{print $1, $3}'

# 输出时指定分隔符(OFS)
echo "apple banana cherry" | awk 'BEGIN{OFS=":"} {print $1, $2, $3}'

2 按列宽切割

即按固定宽度切割

# 使用 substr 函数 echo "12345ABCDE" | awk '{print substr($0, 1, 5), substr($0, 6, 5)}' # 更复杂的例子 data="20240101文件1.txt" echo $data | awk '{ date = substr($0, 1, 8) name = substr($0, 9) print "日期:", date, "文件名:", name }'

3 处理复杂文本

# 示例文本 cat <<EOF > data.txt John:Doe:25:New York Jane:Smith:30:Los Angeles Bob:Johnson:35:Chicago EOF # 按冒号分隔,重新格式化输出 awk -F':' '{print "姓名:", $1, $2, "年龄:", $3, "城市:", $4}' data.txt # 条件筛选 + 切割 awk -F':' '$3 > 30 {print $1 " is older than 30"}' data.txt

输出示例如下所示

姓名: John Doe 年龄: 25 城市: New York
姓名: Jane Smith 年龄: 30 城市: Los Angeles
姓名: Bob Johnson 年龄: 35 城市: Chicago
Bob is older than 30

4 高级切割技巧

# 跳过前N行 ls -la | awk 'NR > 3 {print $9}' # 使用正则表达式匹配分隔 echo "apple-123-orange-456" | awk '{split($0, a, /[0-9]+/); print a[1], a[2]}' # 多字段重新组合 echo "2023-12-25" | awk -F'-' '{print "年月日:", $3"/"$2"/"$1}'

5 常用实际案例

5.1 分析系统进程

# 获取前5个内存使用最多的进程 ps aux | sort -rnk 4 | head -5 | awk '{print "进程:", $11, "内存:", $4"%"}'

5.2 分析日志文件

# 统计IP访问次数 cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn

5.3 CSV文件处理

# 处理CSV文件 awk -F',' 'BEGIN {OFS="\t"} {print $1, $3, $5}' data.csv

5.4 提取特定模式

# 提取email地址 echo "联系我: test@example.com 或 admin@site.org" | \ awk '{ for(i=1; i<=NF; i++) if($i ~ /@/) print "Email found:", $i }'

6 使用内置变量

# NF: 字段数 echo "a b c d e" | awk '{print "字段数:", NF}' # NR: 行号 awk '{print "行号", NR, ":", $0}' data.txt # FS: 输入字段分隔符 # OFS: 输出字段分隔符 awk 'BEGIN{FS=":"; OFS="|"} {print $1, $3}' data.txt

7 一行命令实用例子

# 获取磁盘使用率 df -h | awk '/\/dev\/sd/ {print "磁盘", $1, "使用率:", $5}' # 计算文件总大小 ls -l *.txt | awk '{sum += $5} END {print "总大小:", sum/1024, "KB"}' # 提取URL域名 echo "https://www.example.com/path" | awk -F'/' '{print $3}'

8 结合其他命令使用

# 与 cut 对比(awk更灵活) echo "a:b:c:d" | cut -d':' -f2 # 使用cut echo "a:b:c:d" | awk -F':' '{print $2}' # 使用awk # 与 sed 结合 echo "name=value;age=30" | sed 's/;/\n/g' | awk -F'=' '{print $1}'

需要注意的是,在使用awk时,

使用 `-F` 指定输入分隔符

使用 `OFS` 控制输出分隔符

`$0` 表示整行,`$1`、`$2` 等表示各字段

`NF` 是字段总数,`NR` 是当前行号

可以使用正则表达式作为分隔符

简单列提取用`awk`默认空格分隔,固定宽度用`substr`,复杂分隔用`-F`指定分隔符。

reference

---

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 6:33:54

教育行业AI应用:CSANMT镜像实现课件快速中英互译案例

教育行业AI应用&#xff1a;CSANMT镜像实现课件快速中英互译案例 &#x1f4da; 背景与挑战&#xff1a;教育国际化中的语言壁垒 随着全球教育合作的不断深化&#xff0c;双语教学、国际课程共建、学术论文交流等场景对高质量中英翻译的需求日益增长。传统翻译工具如Google T…

作者头像 李华
网站建设 2026/4/20 22:10:19

2025 AI边缘计算趋势:M2FP CPU推理优化为无卡设备带来新可能

2025 AI边缘计算趋势&#xff1a;M2FP CPU推理优化为无卡设备带来新可能 随着AI模型规模持续膨胀&#xff0c;云端集中式推理的延迟与带宽成本问题日益凸显。在这一背景下&#xff0c;边缘智能&#xff08;Edge Intelligence&#xff09;正成为AI落地的关键路径。尤其在安防监…

作者头像 李华
网站建设 2026/4/21 20:28:50

Neo4j图数据库联动:M2FP解析结果用于构建人体知识图谱

Neo4j图数据库联动&#xff1a;M2FP解析结果用于构建人体知识图谱 &#x1f4cc; 引言&#xff1a;从图像理解到知识表达的跨越 在计算机视觉与知识工程的交叉领域&#xff0c;如何将低层次的像素信息转化为高层次的语义结构&#xff0c;是实现智能系统认知能力跃迁的关键一步。…

作者头像 李华
网站建设 2026/4/18 9:32:14

M2FP模型在智能零售中的人体特征分析

M2FP模型在智能零售中的人体特征分析 &#x1f4cc; 引言&#xff1a;智能零售场景下的视觉理解需求 随着无人零售、智慧门店和个性化推荐系统的快速发展&#xff0c;对消费者行为的精细化感知成为提升运营效率与用户体验的关键。传统监控系统仅能实现“人形检测”或“轨迹追…

作者头像 李华
网站建设 2026/4/19 8:53:55

M2FP模型部署避坑指南:常见错误与解决方案

M2FP模型部署避坑指南&#xff1a;常见错误与解决方案 &#x1f9e9; M2FP 多人人体解析服务概述 在当前计算机视觉应用日益普及的背景下&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09;作为图像语义分割的一个细分方向&#xff0c;正广泛应用于虚…

作者头像 李华
网站建设 2026/4/19 13:32:06

汇编语言全接触-75.汇编中参数的传递和堆栈修正

在 Win32汇编中&#xff0c;我们经常要和 Api 打交道&#xff0c;另外也会常常使用自己编制的类似于 Api 的带参数的子程序&#xff0c;本文要讲述的是在子程序调用的过程中进行参数传递的概念和分析。一般在程序中&#xff0c;参数的传递是通过堆栈进行的&#xff0c;也就是说…

作者头像 李华