2013-09-22 78 views
1

GNU bash,版本3.2.25(1) - 釋放(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. 珠三角| 20130922 | 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. STEP = XFR Start = 2013-09-22 05:09:54.014299結束= 2013-09-22 05:09:56.610330持續時間(秒)= 2寫入= [1]
  4. STEP = XFR Start = 2013-09-22 05:09 :51.886866結束= 2013-09-22 05:09:52.539379持續時間(secs)= 1書寫= [1]
  5. STEP = 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結束= 2013-09-22 05:45:08.299312持續時間(秒)= 1 書面= [1]
  10. STEP = XFR Start = 2013-09-22 06:11:43.464400結束= 2013-09-22 06:11:47.741536持續時間(秒)= 4寫入= [1]
  11. prd | 20130922 | 8900989 | 8962 | STEP = XFR開始= 2013-09-22 05:50:10.625196結束= 2013-09-22 05:51:49.113589 持續時間(秒)= 99寫入= [62617537]
  12. STEP = XFR Start = 2013-09-22 05:51:49。195200結束= 2013-09-22 05:51:51.322727持續時間(秒)= 2寫入= [0]
  13. STEP = 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,AuditID &的ProcessID重複自己每個時間步長= XFR被回顯。)

  1. PRD | 20130922 | 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. prd | 20130922 | 8900984 | 12248 | STEP = XFR開始= 2013-09-22 05:09:54.014299結束= 2013-09-22 05:09:56.610330持續時間(秒)= 2 書面= [1]
  4. prd | 20130922 | 8900984 | 12248 | STEP = XFR開始= 2013-09-22 05:09:51.886866結束= 2013-09-22 05:09:52.539379持續時間(秒)= 1 書面= [1]
  5. prd | 20130922 | 8900984 | 12248 | STEP = 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結束= 2013-09-22 05:45:08.299312時長(秒)= 1 書寫= [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-09-22 05:50:10.625196結束= 2013-09-22 05:51:49.113589 持續時間(秒)= 99寫入= [62617537]
  12. prd | 20130922 | 8900989 | 8962 | STEP = 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寫入= [62617537]
  14. prd | 20130922 | 8900990 | 9061 | STEP = XFR開始= 2013-09-22 05:51:17.891031結束= 2013-09-22 05:51:18。923637持續時間(秒)= 2 書面= [82]

回答

0

嘗試更改for循環到這一個:

#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