【发布时间】:2014-10-29 22:39:03
【问题描述】:
我正在尝试制作一个高效的脚本来读取每个块的(大)文件块,并将最后一个读取块的第一行保存在文件中。 就我而言,如果我想通过管道将文件传输到程序,这非常有用。我可以停止它并稍后在它之前停止的同一行(即同一块行)启动它。
这是脚本:
LINE_FILE=line-file
READ_FILE=the_file
BLOCK=1000
LN_SUP=$(cat $LINE_FILE)
####
trap "save_line ; exit" SIGHUP SIGINT SIGTERM SIGKILL
save_line()
{
echo $LN_SUP > $LINE_FILE
}
block_cat()
{
TEXT=$(tail -n+$LN_SUP $READ_FILE | head -n $BLOCK)
echo "$TEXT"
if [ -n "$TEXT" ]; then
return 0
else
return -1
fi
}
test()
{
return 1
}
file_cat()
{
>&2 echo "First line to read the file : $LN_SUP"
block_cat $READ_FILE
while [ $? -eq 0 ]; do
LN_SUP=$(($LN_SUP + $BLOCK)) #Remember the new first line of the block
block_cat $READ_FILE
done
}
这确实有效,但没有我预期的那么快。
这用于将输出通过管道传输到 aircrack-ng,我损失了将近 18% 的效率。
你认为有更好的方法吗?
【问题讨论】:
-
不打开文件并反复查找可能会有所帮助。不幸的是,除非您想从头开始按顺序阅读,否则在 bash 中这样做是不可能的。
标签: linux bash shell debian pipe