1

GNU bash,版本 3.2.25(1)-release (x86_64-redhat-linux-gnu)。

我有一个文件目录(每天多个文件),我想从中提取某些数据。

每个文件都有一系列对于文件来说是常量的值(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|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 开始=2013-09-22 05:09:54.014299 结束=2013-09-22 05:09:56.610330 持续时间(秒)=2 书面=[1]
  4. STEP=XFR 开始=2013-09-22 05:09:51.886866 结束=2013-09-22 05:09:52.539379 持续时间(秒)=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 开始=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 开始=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-09-22 05:51:17.891031 结束=2013-09-22 05:51:18.923637 持续时间(秒)=2 书面=[82]

期望的结果:(每次回显 STEP=XFR 时,region、log_date、AuditID 和 ProcessID 都会重复。)

  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]
4

1 回答 1

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
于 2013-09-22T21:50:13.340 回答