列出

时间:2018-12-07 04:10:50

标签: bash shell unix sh

我在名为“ downloads”的目录中有以下文件,如何从文件名中获取部分名称(shared,fmw,local)。字符串后面是“ 1000_server003_”可能没有固定的长度,但“ 1000_server003_”每次都保持固定。

1000_server003_shared.tar.gz.part-aa
1000_server003_shared.tar.gz.part-ab
1000_server003_shared.tar.gz.part-ac
1000_server003_shared.tar.gz.part-ad
1000_server003_fmw.tar.gz.part-aa
1000_server003_fmw.tar.gz.part-ab
1000_server003_fmw.tar.gz.part-ac
1000_server003_local.tar.gz.part-aa
1000_server003_local.tar.gz.part-ab

结果应如下

shared
fmw
local

2 个答案:

答案 0 :(得分:0)

您可以使用_.作为分隔符来提取必填字段。

awk -F[_.] '{print $3}' file_name

输出:

shared
shared
shared
shared
fmw
fmw
fmw
local
local

如果只需要不同的名称,只需将其通过管道传递到sort

awk -F[_.] '{print $3}' file_name |sort -u

输出:

fmw
local
shared

答案 1 :(得分:0)

使用Perl

/tmp> ls -1 1000_server0*
1000_server003_fmw.tar.gz.part-aa
1000_server003_fmw.tar.gz.part-ab
1000_server003_fmw.tar.gz.part-ac
1000_server003_local.tar.gz.part-aa
1000_server003_local.tar.gz.part-ab
1000_server003_shared.tar.gz.part-aa
1000_server003_shared.tar.gz.part-ab
1000_server003_shared.tar.gz.part-ac
1000_server003_shared.tar.gz.part-ad
/tmp> perl -e ' print map {(split(/[_.]/))[2],"\n" } @ARGV ' 1000_server0*
fmw
fmw
fmw
local
local
shared
shared
shared
shared

如果您只需要独特的

/tmp> perl -le ' $kv{(split(/[_.]/))[2]}++ for(@ARGV); print foreach(keys %kv) ' 1000_server0*
shared
fmw
local
/tmp>