저는 개발자는 아니지만 SVN 저장소에서 특정 테이블 이름이 포함된 파일을 검색해야 하는 몇 가지 요구 사항이 있습니다. 나는 여기서 읽은 많은 내용을 바탕으로 이 스크립트를 만들었습니다.
printf "table_name, file_name, full_path\n" >> export_list.txt
while read table
do
extract=($(egrep -ilrs $table /path/to/file | egrep -i tag | egrep -v backup))
file_name=$(basename $extract)
printf "$table, $file_name, $extract\n" >> export_list.txt
done < table_list.txt
나는 이런 결과를 기대하고있다
table_name, file_name, full_path
SOMETABLENAME, SomeFileName, /path/to/file/tag1.0/SomeFileName
SOMETABLENAME, SomeFileName, /path/to/file/tag2.0/SomeFileName
SOMETABLENAME, SomeFileName1, /path/to/file/tag1.0/SomeFileName1
SOMETABLENAME, SomeFileName1, /path/to/file/tag2.0/SomeFileName1
대신 SOMETABLENAME에 대해 찾은 첫 번째 행인 하나의 행만 반환합니다.
배열의 사용은 다음에서 비롯됩니다. 이 게시물. 나도 읽었다링크 포스트하지만 솔직히 잘 이해가 되지 않습니다.
내 스크립트에 다른 문제(잘못된 grep 등)가 있거나 다른 더 나은 접근 방식이 있으면 감사하겠습니다.
편집하다:
table_list.txt에는 아래와 같이 2000개의 행이 있습니다.
BI_CLAIMS_SUMMARY
BI_CLAIMS_SUMMARY_AUDIT
BI_MEDS_AUDIT
BI_MEDS_PATIENTS
BI_MEDS_SUMMARY
편집하다:
Jessie가 아래에 제안한 대로 변경했지만(감사합니다), 출력은 제가 (잘못된) 배열 버전을 사용하기 전과 매우 비슷해 보입니다.
table_name, file_name, full_path
BI_CLAIMS_SUMMARY, nohup.out, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_plan_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_proc.sql
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/resources/automation/nohup.out
BI_CLAIMS_SUMMARY_AUDIT, 10_load_claims_summary_audit_sqlserver.sas, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.3/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.4/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/meds/tags/1.0/source/HIU_RISK_REFRESH_CLAIMS_SUMMARY_AUDIT.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas
BI_CLAIMS_SUMMARY가 모든 행에 나타날 것으로 예상합니다. 또한 파일 이름 nohup.out이 file_name 아래에 나타나므로 grep의 출력이 제대로 분할되지 않습니다.
답변1
죄송합니다. 현재 귀하의 문제가 무엇인지 잘 모르겠지만 배열을 호출하는 방식과 관련이 있다고 생각하며 다음 제안 사항이 있습니다.
n=0
printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path' >> export_list.txt
while read -r table
do
extract[$n]=$(egrep -ilrs "$table" /path/to/file | egrep -i tag | egrep -v backup)
file_name=$(basename "${extract[$n]}")
printf '%s,%s,%s\n' "$table" "$file_name" "${extract[$n]}" >> export_list.txt
n=$((n+1))
done < table_list.txt
- 형식
printf
문자열은 항상 실제 내용과 분리되어야 합니다. (printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path'
) - 매개변수 를 사용할 때는 거의 항상 매개변수를
read
사용해야 합니다 . 이렇게 하면 이스케이프된 문자를 리터럴로-r
읽을 수 있습니다.\
- 언제나변수를 큰따옴표로 묶으십시오. 왜냐하면이것그리고이것.
- 배열/배열 요소를 참조할 때는 특수 구문을 사용해야 합니다. 즉
${array[@]}
, (전체 배열) 또는${array[0]}
(배열의 첫 번째 요소)입니다. 호출하면$array
항상 첫 번째 요소만 얻게 됩니다. - 위의 이유로 인해 각 반복에서 올바른 배열 요소를 얻을 수 있는 방법이 필요합니다. 이를 위해
n
루프가 반복될 때마다 증가되는 변수를 추가했습니다.
참고: 여기서는 배열을 사용할 필요가 전혀 없는 것 같습니다. 코드를 extract
다른 곳에서 계속 사용하지 않는 한 간단히 변수로 설정하고 루프를 반복할 때마다 재설정할 수 있습니다.
또한 귀하의 질문에는 "shell-script"라는 태그가 붙어 있지만 POSIX 표준은 배열을 지정하지 않으므로 대부분의 /bin/sh 버전이 배열을 지원하지만 귀하의 버전도 배열을 지원한다는 보장은 없습니다.