我在名为“ 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
答案 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>