You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更简洁优雅的awk/sed提取特定字段中fsvol开头的字符串

更简洁的FSx卷名提取方案

需求:从目标数据文件中过滤以Completed开头的行,解析第4个字段,提取其中以fsvol-开头的最后一段字符串。

原始数据文件

C0BF4EE2-1381
Completed       pod_a0_4    Success volume/fs-04b/fsvol-07     FSx     May 13, 2024, 19:15:08 (UTC+05:30)      May 14, 2024, 03:15:08 (UTC+05:30)
C55114AF-E488
Completed       pod_a0_3    Success volume/fs-04b/fsvol-02     FSx     May 13, 2024, 19:14:56 (UTC+05:30)      May 14, 2024, 03:14:56 (UTC+05:30)
D7AE9EF8-C573
Completed       pod_a0_2    Success volume/fs-04b/fsvol-08     FSx     May 13, 2024, 19:14:44 (UTC+05:30)      May 14, 2024, 03:14:44 (UTC+05:30)
0C662A8C-CD25
Completed       pod_a0_1    Success volume/fs-04b/fsvol-0a     FSx     May 13, 2024, 19:14:33 (UTC+05:30)      May 14, 2024, 03:14:33 (UTC+05:30)

已验证的实现方式

# sed 实现
sed -n  '/^Completed/s/.*\(fsvol-[a-zA-Z0-9]*\).*/\1/p' test-fil1001

# awk + 正则匹配
awk  '/^Completed/{match($4, /fsvol-[a-zA-Z0-9]+/); print substr($4, RSTART, RLENGTH)}' test-fil1001

# awk + cut 管道
awk  '/^Completed/{print $4}' test-fil1001 | cut -d'/' -f3

以上命令均可输出预期结果:

fsvol-07
fsvol-02
fsvol-08
fsvol-0a

更简洁优雅的实现方案

1. awk 内部分割字段

利用awk的split函数直接在第4个字段中按/分割,取最后一段:

awk '/^Completed/{split($4, arr, "/"); print arr[3]}' test-fil1001

2. awk 自定义多分隔符

将空格和/都设为字段分隔符,直接定位到目标字段:

awk -F'[ /]' '/^Completed/{print $6}' test-fil1001

(注:分割后fsvol-xx是第6个字段,前5个分别是Completed、pod_a0_x、Success、volume、fs-04b)

3. 简化版 sed 命令

用[^ ]匹配非空格字符,替代原正则中的字符集,写法更简洁:

sed -n '/^Completed/s/.*\/\(fsvol-[^ ]*\).*/\1/p' test-fil1001

内容的提问来源于stack exchange,提问作者user294110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:08:18