배열 인덱싱에 "sed" 사용

배열 인덱싱에 "sed" 사용

나는 지난 24시간 동안 수정된 디렉토리를 검색한 다음 tar를 사용하여 압축하는 쉘 스크립트를 작성하고 있습니다.

폴더 검색:

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

이 경우 시작 인덱스를 모르고 배열 인덱스를 사용자 정의하거나 배열을 반복하려면 어떻게 해야 합니까?

도와주세요

감사해요

답변1

먼저 명령을 다음과 같이 단순화해야 합니다.

$ 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

관련 정보