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

时间:2019-02-07 07:55:02

标签: awk sed grep

我正在尝试获取第三列,尤其是仅希望提取日期,下面是数据的样子。

示例数据集

N

下面是我尝试获取日期的方法,但是我在下面的命令语法中看到它也包含一些我想删除的字符串。

尝试输入的代码:

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

所需的输出:

[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

说,我只想要数字,只想跳过删除上面代码中的20190204 20190623 20190204 20190411 20190204 20190504 20190419 20190302 20190303 之类的任何字符字符串。

我希望可以使用awk或sed或grep更好,更干净地完成此操作,但只是在摆弄实现的方式。

感谢您的帮助。

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

请您尝试以下。

awk 'match($3,/[0-9]+\.[0-9]+\.[0-9]+/){val=substr($3,RSTART,RLENGTH);gsub(/\./,"",val);print val}' Input_file

OR

awk '{sub(/.*-/,"",$3);gsub(/\./,"",$3);print $3}'  Input_file

答案 3 :(得分:1)

另一种GNU awk方式:

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

您可以根据不同情况对正则表达式进行微调,基本上,准确性与简洁之间需要权衡。

和GNU sed解决方案:

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'

答案 4 :(得分:1)

使用tailcuttr

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

答案 5 :(得分:1)

您也可以尝试Perl单线版

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

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"  '

使用您的输入

$ 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
$

答案 6 :(得分:1)

这可能对您有用(GNU sed):

sed -nr 's/^(\S+\s+){2}\S+(....)\.(..)\.(..)\s+.*/\2\3\4/p' file

模式匹配在第三列上,仅在匹配成功时打印。