簡體   English   中英

在shell腳本中使用unix cat和zcat合並文件時出現問題

[英]problems combining files using unix cat and zcat in shell script

我的shell腳本有問題。 我基本上是試圖使用unix( zcat, cat )命令從(2)個文件創建一個新的日志文件

FileA = gzipped logfile (.gz)
FileB = non-gzipped log file (.log)

FileC = new file from FileA:FileB

我的問題是FileC

例如:FILEA具有從時間戳數據Aug19-Sept3 FILEB具有從時間戳數據Sept4-Sept17 FileC具有從兩個文件=內容Aug19-Sept3:Sept4-Sept17

問題:如果我手動在服務器上運行的命令,文件看起來很好,我希望FileC有從時間戳數據Aug19-Sept17 但是 ,如果與shell腳本編程完成后,本地副本是這樣的,當我將它復制回遠程:FileC = Aug19-Sept17:Aug19-Sept2

所以我的問題是為什么這會以編程方式發生? 有沒有更好的方法將這兩個日志組合/縫合在一起以創建另一個日志?

這是我的shell腳本:

#!/bin/bash
if [ $# != 1 ]; then
    echo "Usage: getlogs.sh <remote-host>" 2>&1
    exit 1
fi

#Declare variables
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/dev/logs/
NEWLOG="foo-temp.log"

#Copy file over
echo "START..." 2>&1
test -f $BACKUP_DIR$1.mysoft.log
if [ $? = 0 ]; then
   echo "Local log file $BACKUP_DIR$1.mysoft.log exists, clean up for new copy..." 2>&1
   /bin/rm $BACKUP_DIR$1.mysoft.log
   else
        echo "File does not exist, getting a new copy..." 2>&1
fi

echo "Checking remotely in $1 for logfile $REMOTE_MYCNF $STAMP" 2>&1
if [ ! -f $REMOTE_MYCNF ]; then
   echo "File exists remotely, creating new logfile and copy here...." 2>&1
   ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
   ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
   /usr/bin/scp $1:$REMOTE_DIR$NEWLOG $BACKUP_DIR$1.mysoft.log
   echo "end remote copy" 2>&1
   echo "Cleaning up remote files" 2>&1
   ssh $1 "rm $REMOTE_DIR$NEWLOG"
   exit 0
   else
        echo "Unable to get file" 2>&1
        exit 0
fi

也許cat可能在zcat完成之前就開始了。 但是,如果是這樣的話,會讓我感到驚訝。

嘗試這個:

ssh $1 "zcat ... >> ...; cat ... >> ..."

要么

ssh $1 "zcat ... >> ..."
sleep 5
ssh $1 "cat ... >> ..."

要么

ssh $1 "zcat -f file1 file2 >> ..."   # let zcat do both files

我無法立即猜測出錯誤是什么,但是您是否嘗試簡化shell腳本? 也就是說,從以下開始:

#!/bin/sh
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/dev/logs/
NEWLOG="foo-temp.log"
ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"

然后從這里開始。 這至少可以讓您隔離問題。

您根本不需要創建遠程臨時文件。 擺脫多個ssh命令,scp和cleanup ssh,然后嘗試以下操作:

ssh $1 "zcat $REMOTE_GZ; cat $REMOTE_MYCNF;" > $BACKUP_DIR$1.mysoft.log

zcat和cat會將數據寫入其stdout,該stdout附加到ssh的stdout,我們將其重定向到文件。

我“保證” zcat寫入其所有數據並在cat開始之前退出,並給出所需的順序。 用“保證”作為引號,因為其他解決方案應該起作用,但據報告不起作用。

臨時文件似乎正在被重用,刪除或截斷:

# Always using the same log for new log.
NEWLOG="foo-temp.log"
# Use a new log truncate '>' the old one
ssh $1 "zcat $REMOTE_GZ > $REMOTE_DIR$NEWLOG"
# This time, append '>>' to new log
ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM