我的脚本如下,用于逐行读取文件
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并在末尾将其删除。我想在我的代码行中添加解压缩和删除任务。
谢谢
答案 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"