2013-09-22 2 views
1

GNU bash, 버전 3.2.25 (1) -release (x86_64-redhat-linux-gnu).Bash 사용 - 여러 결과가 반환되는 for 루프에서 반복 상수

특정 데이터를 추출 할 파일 디렉터리 (하루에 여러 파일)가 있습니다.

각 파일에는 파일 (AuditID, ProcessID 등)에 대해 상수이고 각 파일에 대해 한 번만 나타나는 일련의 값이 있습니다. 각 파일에 "STEP = XFR"로 시작하는 줄이 여러 개 있습니다.

목표 : 위에서 언급 한 상수와 "STEP = XFR"로 시작하는 각 줄이 포함 된 단일 출력을 만듭니다.

문제 : FOR LOOP을 실행하여 파일을 처리 할 때 상수는 모든 줄 대신 파일마다 한 번만 에코됩니다.

필자는 검색하고 검색했으며 (bash가 매우 새로 도입되었지만) 대답을 찾지 못했습니다.

나는 꽤 sed를 사용하여 STEP = XFR 라인을 파싱하는데, 대체로 상수를 포함 할 수 있었지만, 대부분의 sed 문을 훔쳐 갔고 실제로 이해하지 못했습니다. 더 명확한 것을 위해.

현재 나는 파싱되지 않은 STEP = XFR 라인을 출력하는 동시에 동시에 앞에있는 상수를 연결하려고합니다.

다음은 내가 가지고있는 것입니다 ... 그리고 많은 감사합니다.

region=$1 
log_date=$2 

cur_date=`date +%Y%m%d` 

if [[ -z $1 ]]; then 
    region=$Region 
fi 

if [[ -z $2 ]]; then 
    log_date=$cur_date 
fi 

#define location of source file 
file_loc='/bl/project/'$region'/netezza/log' 

#declare directory/file mask 
files=$file_loc'/LOG_nz_flow_execute_svckmnz_elt_'$log_date'*.log' 

#define file name and location to put results 
xfrmon_results="/home/userid/quality/xfrmon_"$region"_"$log_date".dat" 

#loop through files... 
for f in $files 
do 
#grep for values 
d='|' 
AuditID=$(grep "^Audit ID" $f | cut -d':' -f2 | head -n 1) 
ProcessID=$(grep "^Process ID" $f | cut -d':' -f2 | head -n 1) 
xfrmeta=$(grep "STEP=XFR " $f) 

lineout="$region$d$log_date$d$AuditID$d$ProcessID$d$xfrmeta" 

echo "$lineout" 

done 

결과 :

  1. PRD | 20,130,922 | 8900983 | 7718 |
  2. prd | 20130922 | 8900984 | 12248 | STEP = XFR 시작 = 2013-09-22 03 : 30 : 08.493374 끝 = 2013-09-22 03 : 30 : 08.988577 지속 시간 (초) = 1 기록 = [1]
  3. 단계 = XFR 시작 = 2013-09-22 05 : 09 : 54.014299 끝 = 2013-09-22 05 : 09 : 56.610330 지속 시간 (초) = 2 글자 = [1]
  4. 단계 = XFR 시작 = 2013-09-22 05:09 : 51.886866 End = 2013-09-22 05 : 09 : 52.539379 지속 시간 (초) = 1 Written = [1]
  5. 단계 = XFR 시작 = 2013-09-22 05 : 09 : 51.831049 끝 = 2013-09- 22 05 : 09 : 52.319850 지속 시간 (초) = 1 Written = [1]
  6. prd | 20130922 | 8900985 | 11316 |
  7. prd | 20130922 | 8900986 | 989 |
  8. prd | 20130922 | 8900987 | 1977 |
  9. prd | 20130922 | 8900988 | 25269 | STEP = XFR 시작 = 2013-09-22 05 : 45 : 07.923100 끝 = 2013-09-22 05 : 45 : 08.299312 지속 시간 (초) = 1 작성된 = [1]
  10. STEP = XFR 시작 = 2013-09-22 06 : 11 : 43.464400 End = 2013-09-22 06 : 11 : 47.741536 지속 시간 (초) = 4 Written = [1]
  11. prd | 20130922 | 8900989 | 8962 | STEP = XFR 시작 = 2013-09-22 05 : 50 : 10.625196 끝 = 2013-09-22 05 : 51 : 49.113589 지속 시간 (초) = 99 Writed = [62617537]
  12. STEP = XFR 시작 = 2013-09-22 05:51:49.195200 End = 2013-09-22 05 : 51 : 51.322727 지속 시간 (초) = 2 Written = [0]
  13. 단계 = XFR 시작 = 2013-09-22 05 : 51 : 51.558343 끝 = 2013-09-22 05 : 52 : 12.234552 지속 시간 (초) = 21 글자 = [62617537]
  14. prd | 20130922 | 8900990 | 9061 | STEP = XFR 시작 2013년 9월 22일 = 05 : 51 : 17.891031 최종 2013년 9월 22일 = 05 : 51 : 18.923637 시간 (초) = 2 원하는 글 = [82]

결과 : (지역, log_date는 &은 ProcessID 자신 XFR은 echo'd됩니다 = 각 시간 단계 반복 AuditID.)

  1. PRD | 20,130,922 | 8900983 | 7718 |
  2. prd | 20130922 | 8900984 | 12248 | 단계 = XFR 시작 = 2013-09-22 03 : 30 : 08.493374 끝 = 2013-09-22 03 : 30 : 08.988577 지속 시간 (초) = 1 글쓰기 = [1]
  3. prd | 20130922 | 8900984 | 12248 | 단계 = XFR 시작 = 2013-09-22 05 : 09 : 54.014299 끝 = 2013-09-22 05 : 09 : 56.610330 지속 시간 (초) = 2 작성된 = [1]
  4. prd | 20130922 | 8900984 | 12248 | 단계 = XFR 시작 = 2013-09-22 05 : 09 : 51.886866 끝 = 2013-09-22 05 : 09 : 52.539379 지속 시간 (초) = 1 Written = [1]
  5. prd | 20130922 | 8900984 | 12248 | 단계 = XFR 시작 = 2013-09-22 05 : 09 : 51.831049 끝 = 2013-09-22 05 : 09 : 52.319850 지속 시간 (초) = 1 글쓰기 = [1]
  6. prd | 20130922 | 8900985 | 11316 |
  7. prd | 20130922 | 8900986 | 989 |
  8. prd | 20130922 | 8900987 | 1977 |
  9. prd | 20130922 | 8900988 | 25269 | STEP = XFR 시작 = 2013-09-22 05 : 45 : 07.923100 End = 2013-09-22 05 : 45 : 08.299312 지속 시간 (초) = 1 Written = [1]
  10. prd | 20130922 | 8900988 | 25269 | STEP = XFR 시작 = 2013-09-22 06 : 11 : 43.464400 끝 = 2013-09-22 06 : 11 : 47.741536 지속 시간 (초) = 4 글쓰기 = [1]
  11. prd | 20130922 | 8900989 | 8962 | STEP = XFR 시작 = 2013년 9월 22일 05 : 50 : 10.625196 끝 = 2013년 9월 22일 05 : 51 : 49.113589 기간 (초) = 99 글은 = [62617537]
  12. PRD | 20,130,922 | 8900989 | 8962 | 단계 = XFR 시작 = 2013-09-22 05 : 51 : 49.195200 끝 = 2013-09-22 05 : 51 : 51.322727 지속 시간 (초) = 2 작성 됨 = [0]
  13. prd | 20130922 | 8900989 | 8962 | STEP = XFR 시작 = 2013-09-22 05 : 51 : 51.558343 끝 = 2013-09-22 05 : 52 : 12.234552 지속 시간 (초) = 21 Writed = [62617537]
  14. prd | 20130922 | 8900990 | 9061 | 단계 = XFR 시작 = 2013-09-22 05 : 51 : 17.891031 끝 = 2013-09-22 05:51:18.923,637 시간 (초)이 하나 귀하의 for 루프를 변경하려면 2 글 = [82]

답변

0

시도를 = :

#loop through files... 
for f in $files; do 
    #grep for values 
    d='|' 
    AuditID=$(grep "^Audit ID" "$f" | cut -d':' -f2 | head -n 1) 
    ProcessID=$(grep "^Process ID" "$f" | cut -d':' -f2 | head -n 1) 

    while read -r xfrmeta; do 
     echo "$region$d$log_date$d$AuditID$d$ProcessID$d$xfrmeta" 
    done < <(exec grep "STEP=XFR " "$f") 
done 

It would create an instance of a line for every line in the output of grep using process substitution and `while read` loop. 

나는 또한 예상치 못한 방지하기 위해뿐만 아니라 배열의 파일 경로를 저장하는 것이 좋습니다 단어 분할 및 경로 이름 확장 :

files=("/path/to/file1" "/path/to/file1" ...) 
for f in "${files[@]}"; do 
관련 문제