如何用更简洁优雅的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
相关产品推荐
相关产品推荐

