1

GNU bash、バージョン 3.2.25(1) リリース (x86_64-redhat-linux-gnu)。

特定のデータを抽出したいファイルのディレクトリ (1 日に複数のファイル) があります。

各ファイルには、ファイルに対して一定の一連の値 (AuditID、ProcessID など) があり、ファイルごとに 1 回表示されます。次に、各ファイルには「STEP=XFR」で始まる多くの行があります

目標: 上記の定数と、「STEP=XFR」で始まる各行を含む 1 行の出力を作成します。

問題: ファイルを処理するために FOR LOOP を実行すると、定数はすべての行ではなく、ファイルごとに 1 回だけエコーされます。

私は検索して検索しました(そして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 Start=2013-09-22 05:51:51.558343 End=2013-09-22 05:52:12.234552 Duration(secs)=21 Written=[62617537]
  14. prd|20130922| 8900990| 9061|STEP=XFR 開始=2013-09-22 05:51:17.891031 終了=2013-09-22 05:51:18.923637 期間(秒)=2 書き込み=[82]

望ましい結果: (リージョン、log_date、AuditID、および ProcessID は、STEP=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]
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 に答える