extrair data “2017-01-26” (em aaaa-mm-dd) dos arquivos nome como “abcd.log.2017_01_26_23_30.0”

0

Eu tenho alguns arquivos em /mainFolder/test :

abcd.log.2017_01_26_23_30.0
abcd.log.2017_01_26_23_35.0
abcd.log.2017_02_20_23_10.0
xyz1.log.2017-02-01
xyz2.log.2017-03-11

A partir desses arquivos, preciso de um arquivo como abcd.log.2017_01_26_23_30.0 . Para pesquisar, estou tentando assim:

myRegex="[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}.[0-9]{1}"
realPath="/mainFolder/test/abcd.log.2017_01_26_23_30.0"
[[ $realPath =~ $myRegex ]] && echo "It is matching" || echo "Does not match"

Depois de obter os arquivos, preciso extrair as datas no formato yyyy-mm-dd (ou seja, eu preciso de 2017-01-26 ).

Como posso fazer isso?

    
por A.Majuli 15.02.2017 / 10:26

2 respostas

3

Usando grupos de captura e $BASH_REMATCH para extrair bits de sequências:

for name in *.log.*; do
    if [[ "$name" =~ \.([0-9]{4})_([0-9]{2})_([0-9]{2}) ]]; then
        printf '%d-%d-%d from "%s"\n' \
            "${BASH_REMATCH[1]}" \
            "${BASH_REMATCH[2]}" \
            "${BASH_REMATCH[3]}" \
            "$name"
    fi
done

Saída:

2017-01-26 from "abcd.log.2017_01_26_23_30.0"
2017-01-26 from "abcd.log.2017_01_26_23_35.0"
2017-02-20 from "abcd.log.2017_02_20_23_10.0"

Se você precisar da string de data em uma variável:

for name in *.log.*; do
    if [[ "$name" =~ \.([0-9]{4})_([0-9]{2})_([0-9]{2}) ]]; then
        datestring="$( printf '%d-%d-%d' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" )"
        printf '%s from "%s"\n' "$datestring" "$name"
    fi
done

Em ksh93 , substitua BASH_REMATCH por .sh.match .

    
por 15.02.2017 / 10:53
0

Eu usaria perl e lidaria com isso assim:

#!/usr/bin/env perl
use strict;
use warnings;

while ( <> ) {
  my ( @date ) = m/(\d{4})\D(\d{2})\D(\d{2})/;
  my $date_str = join "-", @date;
  print $date_str,"\n";
}

Combina '4 dígitos', '2 dígitos', '2 dígitos' e os reformata para serem - delimitados. Ele assume que seus números são ordenados da maneira "correta".

    
por 15.02.2017 / 13:09