将.gz文件解压缩到/ tmp位置,并在任务完成后删除未解压缩的.gz文件

时间:2018-06-21 18:12:59

标签: linux bash shell

我的脚本如下,用于逐行读取文件

file= "/c/User/XXX/Desktop/XYZ.log" 
while IFS= read -r line
do
    if echo $line | grep  -Eq 'something' ; then

      [ do these tasks ]


    # define the log directory
    log_dir=/c/Users/xxxxx/Desktop/Logs/"$DIR"/read_log

    # define the log file for this month
    log_file="$log_dir/rlog-$(date +%Y-%m)"

    # Create the log directory.
    if [ ! -d "$log_dir" ]; then
           mkdir -p "$log_dir" ||
                   die "failed to create log directory $log_dir"
    fi

    echo "variable" >> "$log_file"

    fi  
done <"$file"

实际上我应该读取的文件是.gz文件, 其中的单个大文件位于某个路径/ x / y / z。我想知道如何将此文件解压缩到特定位置/ tmp并在末尾将其删除。我想在我的代码行中添加解压缩和删除任务。

谢谢

4 个答案:

答案 0 :(得分:0)

您可以使用while将tar文件提取到read并根据需要逐行处理:

file=/c/User/XXX/Desktop/XYZ.gz
tar -xzf - $file | while IFS= read -r line
do
...
done

答案 1 :(得分:0)

您可能可以摆脱:

zcat "$file" | while IFS= read line do ... done

应该进行管道传输,因此您不需要临时文件。

答案 2 :(得分:0)

.gz文件的内容不清楚。基于您提到路径的事实,我假设您实际上有一个.tar.gz文件(即,一个包含.tar文件的.gz文件,而该文件又打包了一个.tar文件,例如x / y /z/thefile.log)。

在这种情况下,您可能不需要解压缩到临时文件,只需这样做(-O告诉tar将文件发送到stdout而不是将它们保存到磁盘):

tar -O -zxf myfile.tar.gz | while read -r line ; do ...

如果您仍想将其保存到一个临时文件中(例如,因为您不想在子进程中运行“ while ...”):

tmpfile=/tmp/your-chosen-file-path
tar -O -zxf myfile.tar.gz >"$tmpfile"
while read ... ; do
done <"$tmpfile"
rm "$tmpfile

注意,无论哪种方式,都假定您的.tar.gz档案中只有一个文本文件(如果有很多文本文件,则所有文件都将被tar -O命令转储到stdout。)

答案 3 :(得分:0)

您将要使用zgrep

log_dir=/c/Users/xxxxx/Desktop/Logs/"$DIR"/read_log
mkdir -p "$log_dir"
log_file="$log_dir/rlog-$(date +%Y-%m)"
file="/c/User/XXX/Desktop/XYZ.log.gz" 

if zgrep -Eq 'something' "$file"; then 
    echo "variable" >> "$log_file"
fi

或者,如果您想在日志文件中为匹配的每行添加一些内容,则:

zgrep -E 'something' "$file" | while IFS= read -r matched_line; do
    echo "variable"
done  >> "$log_file"