Как извлечь последний столбец поля три только с номерами - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить третий столбец и, в частности, хочу извлечь только даты, вот как выглядят данные.

Пример набора данных

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

Сказав это, я хочу только цифры и просто хочу пропустить удаление любых строк символов, таких как index в приведенном выше коде.

Я надеюсь, что это можно сделать лучше и точнее с помощью любого awkили sed или grep, но просто возиться с пути к достижению.

спасибо за вашу помощь.

Ответы [ 7 ]

0 голосов
/ 07 февраля 2019

Это может сработать для вас (GNU sed):

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

Совпадение с образцом в третьем столбце, печать только при успешном совпадении.

0 голосов
/ 07 февраля 2019
$ awk 'sub(/.*-/,"",$3){gsub(/\./,"",$3); print $3}' file
20190204
20190623
20190204
20190411
20190204
20190504
20190419
20190302
20190303
0 голосов
/ 07 февраля 2019

Вы также можете попробовать 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
$
0 голосов
/ 07 февраля 2019

С tail, cut и tr:

<infile tail -n+2 | tr -s ' ' | cut -d' ' -f3 | rev | cut -d- -f1 | rev | tr -d .
0 голосов
/ 07 февраля 2019

Другой способ 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'
0 голосов
/ 07 февраля 2019

Это один из способов:

$ 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
0 голосов
/ 07 февраля 2019

Не могли бы вы попробовать следующее.

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

ИЛИ

awk '{sub(/.*-/,"",$3);gsub(/\./,"",$3);print $3}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...