awk/sed 提取特定字段

问题描述 投票:0回答:1

我有以下文件数据,我想解析和过滤这些数据以从第四个字段获取卷名称,从而我想提取以 ^fsvol- 开头的最后一个字符串。

数据文件:

(devcli) $ cat test-fil1001
C0BF4EE2-1381-0D18-13A4-FBA57F84A028
Completed       soc_be_fe_dm_a0_dihdmi_1        Success volume/fs-04b1dcf0d5b80b5a7/fsvol-07c8364e1ae52d087     FSx     May 13, 2024, 19:15:08 (UTC+05:30)      May 14, 2024, 03:15:08 (UTC+05:30)
C55114AF-E488-5FEB-F170-5B2082D21E5E
Completed       soc_be_fe_dm_a0_top_irdrop_1    Success volume/fs-04b1dcf0d5b80b5a7/fsvol-02700f37153d67f85     FSx     May 13, 2024, 19:14:56 (UTC+05:30)      May 14, 2024, 03:14:56 (UTC+05:30)
D7AE9EF8-C573-9009-F801-4D3C0C7EC7A1
Completed       soc_be_fe_dm_a0_top_irdrop_2    Success volume/fs-04b1dcf0d5b80b5a7/fsvol-083d95b98e1df03dc     FSx     May 13, 2024, 19:14:44 (UTC+05:30)      May 14, 2024, 03:14:44 (UTC+05:30)
0C662A8C-CD25-8AF4-F2E2-BEF622A49849
Completed       soc_be_fe_dm_a0_top_iosta_1     Success volume/fs-04b1dcf0d5b80b5a7/fsvol-0ad43cb17044803ac     FSx     May 13, 2024, 19:14:33 (UTC+05:30)      May 14, 2024, 03:14:33 (UTC+05:30)
5FCF3C2A-6D2B-D16F-C8DC-3BC6564D91E4

测试试用和结果:

(devcli) $ sed -n  '/^Completed/s/.*\(fsvol-[a-zA-Z0-9]*\).*/\1/p' test-fil1001
fsvol-07
fsvol-02
fsvol-08
fsvol-0a
(devcli) $ awk  '/^Completed/{match($4, /fsvol-[a-zA-Z0-9]+/); print substr($4, RSTART, RLENGTH)}' test-fil1001
fsvol-07
fsvol-02
fsvol-08
fsvol-0a
(devcli) $ awk  '/^Completed/{print $4}' test-fil1001 | cut -d'/' -f3
fsvol-07
fsvol-02
fsvol-08
fsvol-0a

我已经在上面尝试过了,这是有效的,但正在寻找一种最好的方法来用更短的版本或优雅的方式来做到这一点。

linux awk sed
1个回答
1
投票

您可以使用单个

awk
命令来完成此操作:

awk '/^Completed/ && split($4, a, /\//) >= 3 {print a[3]}' file

fsvol-07c8364e1ae52d087
fsvol-02700f37153d67f85
fsvol-083d95b98e1df03dc
fsvol-0ad43cb17044803ac
© www.soinside.com 2019 - 2024. All rights reserved.