grep在某些列上

时间:2018-02-20 21:41:30

标签: shell

我在使用lftp的ftps服务器上。当我运行ls时,我得到类似的东西(没有额外的标志):

02-19-18  11:32AM       <DIR>          Wingdings
01-31-18  05:17PM       <DIR>          Dongles
02-20-18  08:21AM       <DIR>          Dingbats
02-20-18  09:42AM                      Foobars
01-25-18  11:19AM                      Coolcats
02-13-18  02:51AM                      McDonald

我正在尝试获取名称中包含大写字母D的所有文件夹或目录,因此我跑了:

lftp xxx@xxx:/> ls | grep D
02-19-18  11:32AM       <DIR>          Wingdings
01-31-18  05:17PM       <DIR>          Dimwits
02-20-18  08:21AM       <DIR>          Dingbats
02-13-18  02:51AM                      McDonald

我只期望获得Dimwits和Dingbats,但由于该行中的<DIR>,我也得到了Wingdings。我知道我可以跑:

lftp xxx@xxx:/> ls | awk {\'print $4\'} | grep D
Dimwits
Dingbats
McDonald

但这会截断我想要的前三列。

有没有办法做到这一点:

lftp xxx@xxx:/> ****** some magical command ******
01-31-18  05:17PM       <DIR>          Dimwits
02-20-18  08:21AM       <DIR>          Dingbats
02-13-18  02:51AM                      McDonald

4 个答案:

答案 0 :(得分:0)

列出文件和目录的正确命令是:

lftp xxx@xxx:/> glob -a echo *D*

输出:

Dongles Dingbats DIR DIR DIR...

此列表文件和目录(-a)并且不需要解析ls

检查:

man lftp | less +/glob

don't parse ls output !

答案 1 :(得分:0)

我可以请你尝试使用以下命令: -

lftp xxx@xxx:/> ls | grep "*D???"

答案 2 :(得分:0)

要仅获取包含给定列中字符串的行并获取此行的所有列,请使用以下内容:

 ls | awk '($3 == "<DIR>" && $4 ~ /D/) || ($3 != "<DIR>" && $3 ~ /D/) { print }'

答案 3 :(得分:0)

如果要在最后一个字段中找到D,请在其后面找到没有fieldsep的D.我认为你需要标签,我用空格测试了它:

this.CreateMap<MyViewModel, MyModel>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
    .ForMember(dest => dest.FieldA, opt => opt.MapFrom(src => StaticHelper.Parse(src.Value).FieldA))
    // More instances of the same static helper unnecessarily instantiated.
    .ForMember(dest => dest.FieldG, opt => opt.MapFrom(src => StaticHelper.Parse(src.Value).FieldG));