Obtém o nome do diretório do nome do arquivo

1

Eu quero criar um nome de diretório extraindo partes de um nome de arquivo. Aqui estão alguns exemplos:

  1. server.log.2016-03-20-1420160320
  2. server-2016-03-17-13-16-Restart.log20160317

Estou usando o HP-UX.

    
por Chirag Dhaduk 20.03.2016 / 11:37

3 respostas

1

Você poderia usar o awk para isso.

1)

echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'

2)

echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'
    
por 20.03.2016 / 11:59
1

Você pode passar o nome do arquivo para a verificação de regex, com sed:

echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)//g'

echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log//g'

Se você precisar de regex mais rigoroso, por exemplo, meses podem ser descritos com regex

0[0-9]\|1[12]

e os dias são

0[1-9]\|[12][0-9]\|3[01]
    
por 20.03.2016 / 12:15
0

Você pode fazer isso com as construções de manipulação de strings do shell. Isso requer um shell POSIX, portanto, se você estiver executando uma versão antiga do HP-UX, talvez seja necessário chamar um shell POSIX, como o ksh, em vez do shell Bourne.

Você não especificou completamente como analisar a data. Estou assumindo que a primeira correspondência de ????-??-?? , em que cada um dos ?? são dígitos, é a data que você deseja.

p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"

Não é o código mais legível, mas funciona.

    
por 20.03.2016 / 17:26