Indexação de array usando "sed"

1

Estou trabalhando em um script de shell que o diretório de pesquisa modificou nas últimas 24 horas e depois os compactou usando tar.

Pesquisa de pastas:

find /path to log directory/ -maxdepth 1 -type d -mtime +0 

exemplo:

/path to log directory/01_05_2016
/path to log directory/02_05_2016
/path to log directory/03_05_2016
/path to log directory/04_05_2016

Truncar caráter desnecessário:

find /path to log directory/ -maxdepth 1 -type d -mtime +0 | tr -d "_" | tr -d "path to log directory"

exemplo:

01052016 02052016 03052016 04052016

Separe as strings truncadas como elemento de matriz individual usando "sed":

# Folder search

declare -a array="($(find <0-24 hour directory serach> | <truncate uncecessary character> | sed 's/\([0-9]*\).*/[]=""/'))"

# Array Printing
echo "Number of Array Elements: "${#array[@]}
echo "array[01052016]: " ${array[01052016]}
echo "array[02052016]: " ${array[02052016]}
echo "array[03052016]: " ${array[03052016]}
echo "array[04052016]: " ${array[04052016]}

exemplo de saída

Number of Array Elements: 4
array[01052016]: 01052016
array[02052016]: 02052016
array[03052016]: 03052016
array[04052016]: 04052016

Comprimir a saída:

LOG_DIR_NAME='<find folder>'

xargs tar -cvzPf /ouput folder/logname.tar.gz  /path to log directory $LOG_DIR_NAME

Declaração do problema:

Com o uso do comando sed, posso separar a string de pesquisa em um elemento de matriz individual. Com o uso deste comando

sed 's/\([0-9]*\).*/[]=""/'

onde [\ 1] define meu índice de matriz e "\ 1" define meu elemento.

Saída desejada Estou interessado em obter o elemento da matriz armazenado do índice (0 a n)

array[0]: 01052016
array[1]: 02052016
array[2]: 03052016
array[3]: 04052016

Como eu posso personalizar a indexação de array neste caso ou atravessar a matriz sem saber o índice inicial?

Por favor ajude

Obrigado

    
por Kunal Sonone 01.06.2016 / 18:04

1 resposta

1

Antes de mais nada, você deve simplificar seu comando para:

$ find "/path to log directory/" -maxdepth 1 -type d -mtime +0 | sed 's#.*/##; s#_##g' 
01052016
03052016
04052016
02052016

Em seguida, para salvar como uma matriz, você pode fazer:

array=( $(find "/path to log directory/" -maxdepth 1 -type d -mtime +0 | sed 's#.*/##; s#_##g') )

Isso salva como você deseja, em uma matriz com índices numéricos crescentes a partir de 0:

$ for i in {0..3}; do echo "$i : ${array[$i]}"; done
0 : 01052016
1 : 03052016
2 : 04052016
3 : 02052016

Dito isso, se você precisar se iterar em um array associativo, também poderá fazer isso:

$ declare -a array=( "foo"=>"bar" "baz"=>"bad" )
$ for i in ${!array[*]}; do echo "$i : ${array[$i]}"; done
baz : bad
foo : bar
    
por 01.06.2016 / 18:32