web-dev-qa-db-ja.com

「sed」を使用した配列のインデックス作成

過去24時間に変更されたディレクトリを検索し、tarを使用してそれらを圧縮する1つのシェルスクリプトに取り組んでいます。

フォルダ検索:

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

出力例:

/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

不要な文字を切り捨てます:

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

出力例:

01052016 02052016 03052016 04052016

"sed"を使用して切り捨てられた文字列を個々の配列要素として分離します:

# Folder search

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

# 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]}

出力例

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

出力を圧縮します:

LOG_DIR_NAME='<find folder>'

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

問題の説明:

Sedコマンドを使用することで、検索文字列を個々の配列要素に分割できます。このコマンドを使用して

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

ここで、[\ 1]は配列インデックスを定義し、「\ 1」は要素を定義します。

目的の出力配列要素をインデックス(0からn)に格納することに興味があります

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

この場合、配列のインデックスをカスタマイズしたり、開始インデックスを知らずに配列をトラバースしたりするにはどうすればよいですか?

助けてください

ありがとうございました

2
Kunal Sonone

まず、コマンドを次のように簡略化する必要があります。

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

次に、配列として保存するには、次のようにします。

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

これにより、0から始まる数値の増加するインデックスを持つ配列に、必要に応じて保存されます。

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

とはいえ、連想配列を反復処理する必要がある場合は、それも実行できます。

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