我正在尝试获取第三列,尤其是仅希望提取日期,下面是数据的样子。
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更好,更干净地完成此操作,但只是在摆弄实现的方式。
感谢您的帮助。
答案 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)
使用tail
,cut
和tr
:
<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
模式匹配在第三列上,仅在匹配成功时打印。