如何最后一个字段列仅三个有数字提取

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

我试图让第三列,特别是想只能提取日期,下面就是数据的模样。

Example dataset

health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   dpc-syslog-2019.02.04           HJNqQMd_T1qbyHM5HEHGUw   5   1   46559620            0     37.1gb         18.5gb
green  open   syslog-2019.06.23               Q73bPEXUQz64Pt7eh-a3pQ   5   1       4930            0      2.1mb            1mb
green  open   .monitoring-kibana-6-2019.02.04 _5_68NpKStWo3dBFOXZUlw   1   1       8749            0        5mb          2.5mb
green  open   syslog-2019.04.11               e45heIjRTGqO_KHS8He0Ag   5   1         14            0      109kb         54.5kb
green  open   syslog-2019.02.04               -tshSKMAR8GKYnY2KSqn_Q   5   1   19236875            0        5gb          2.5gb
green  open   syslog-2019.05.04               cTgQAcT-QkKklhsKucvotA   5   1         14            0      141kb         70.5kb
green  open   syslog-2019.04.19               CXzRauBZTWu64HB8KTCj5A   5   1         14            0    108.9kb         54.4kb
green  open   syslog-2019.03.02               ap9TDVkIQeGRbTQ9Qpzarg   5   1         14            0    108.3kb         54.1kb
green  open   syslog-2019.03.03               uNcOfR8gSfWYWJgh1Bp9WQ   5   1         14            0    107.6kb         53.8kb

下面是我试图让时间,但我认为,在我下面的命令语法,它有一些字符串,以及哪个我想删除。

Attempted code :

[root@host1 ~]# curl -s -XGET http://127.0.0.1:9200/_cat/indices?v | awk '{print $3}'|cut -d. -f1-3 | sed 's/\.//g' | awk -F- '{print $NF}' | head
index
kibana
20190204
20190623
20190204
20190411
20190204
20190504
20190419
20190302
20190303

Desired output :

20190204
20190623
20190204
20190411
20190204
20190504
20190419
20190302
20190303

话说,我想只有数字,只是想跳过删除任何字符的字符串就像上面的代码index的。

我希望这可以更好地,并用AWK或SED或者grep的只是周围的方式来实现摆弄干净完成。

谢谢你的帮助。

awk sed grep
7个回答
1
投票

另一个GNU AWK方式:

awk '$3~/[0-9]{4}/{print gensub(/.*-|[^0-9]*/, "", "g", $3)}'

您可以微调在不同的情况下,正则表达式的基础,基本上准确性权衡与简洁。

和GNU,但解决的办法;

sed -E '/(\S*\s+){2}.*[0-9]{4}(\.[0-9]{2}){2}/!d; s/(\S*\s+){2}(\S*\s+).*/\2/g; s/.*-|[^0-9]*//g'

3
投票

这是一种方式:

$ awk '$3~/[0-9]{4}(\.[0-9]{2}){2}$/{gsub(/^.*-|[^0-9]/,"",$3);print $3}' file
20190204
20190623
20190204
...

解释:

$ awk '$3~/[0-9]{4}(\.[0-9]{2}){2}$/ {  # picking records on regex
    gsub(/^.*-|[^0-9]/,"",$3)           # remove all before last dash and non-digits
    print $3                            # output
}' file

2
投票
$ awk 'sub(/.*-/,"",$3){gsub(/\./,"",$3); print $3}' file
20190204
20190623
20190204
20190411
20190204
20190504
20190419
20190302
20190303

1
投票

随着qazxsw POI,qazxsw POI和POI qazxsw:

tail

1
投票

您可以尝试的Perl一行代码也

cut

要么

tr

由于头不匹配的日期模式,在线路号码检查($。)也被去除。

<infile tail -n+2 | tr -s ' ' | cut -d' ' -f3 | rev | cut -d- -f1 | rev | tr -d .

与你的投入

perl -lane ' if($.>1) { $F[2]=~/.*\-(\d+).(\d+).(\d+)/ and print "$1$2$3" } '

1
投票

可否请您尝试以下操作。

perl -lane ' if($.>1) { $F[2]=~/.*\-(\S+)/ and ($t=$1)=~tr/\.//d and print $t  } ' 

要么

perl -lane ' $F[2]=~/.*\-(\d+).(\d+).(\d+)/ and print "$1$2$3"  '

1
投票

这可能会为你工作(GNU SED):

$ cat pygo.txt
health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   dpc-syslog-2019.02.04           HJNqQMd_T1qbyHM5HEHGUw   5   1   46559620            0     37.1gb         18.5gb
green  open   syslog-2019.06.23               Q73bPEXUQz64Pt7eh-a3pQ   5   1       4930            0      2.1mb            1mb
green  open   .monitoring-kibana-6-2019.02.04 _5_68NpKStWo3dBFOXZUlw   1   1       8749            0        5mb          2.5mb
green  open   syslog-2019.04.11               e45heIjRTGqO_KHS8He0Ag   5   1         14            0      109kb         54.5kb
green  open   syslog-2019.02.04               -tshSKMAR8GKYnY2KSqn_Q   5   1   19236875            0        5gb          2.5gb
green  open   syslog-2019.05.04               cTgQAcT-QkKklhsKucvotA   5   1         14            0      141kb         70.5kb
green  open   syslog-2019.04.19               CXzRauBZTWu64HB8KTCj5A   5   1         14            0    108.9kb         54.4kb
green  open   syslog-2019.03.02               ap9TDVkIQeGRbTQ9Qpzarg   5   1         14            0    108.3kb         54.1kb
green  open   syslog-2019.03.03               uNcOfR8gSfWYWJgh1Bp9WQ   5   1         14            0    107.6kb         53.8kb
$ perl -lane ' if($.>1) { $F[2]=~/.*\-(\S+)/ and ($t=$1)=~tr/\.//d and print $t  } ' pygo.txt
20190204
20190623
20190204
20190411
20190204
20190504
20190419
20190302
20190303
$

在第三列模式匹配,如果匹配成功,只有打印。

© www.soinside.com 2019 - 2024. All rights reserved.