如何使用tail -n读取行

时间:2015-11-05 02:16:54

标签: bash csv while-loop tail

问题:我有一个CSV转储文件 - 超过250,000行。当我使用while read时 - 需要一段时间(没有双关语)。我想回到最后10,000行来做我需要做的事情而不是250,000行。

代码段:我当前的代码是:

IFS=","
while read line
do

    awk_var=`echo "$line" | awk -F" " '{print $0}'`

    var_array=($awk_var)

    read -a var_array <<< "${awk_var}"

    echo "${var_array[1]}"


done </some_directory/directory/file_in_question.csv

问题:在使用bash脚本阅读tail -n10000时如何将while read linefile_in_question.csv一起使用?

3 个答案:

答案 0 :(得分:3)

替换:

done </some_directory/directory/file_in_question.csv

使用:

done < <(tail -n10000 /some_directory/directory/file_in_question.csv)

<(...)构造称为流程替换。它创建了一个类似文件的对象,bash可以从中读取。因此,这会直接取代some_directory/directory/file_in_question.csv的阅读,并从tail -n10000 /some_directory/directory/file_in_question.csv读取。

使用像这样的进程替换允许您将while循环保留在主shell中,而不是子shell。因此,在while循环中创建的变量将在循环退出后保留其值。

加速原始代码

显示的代码打印CSV文件的第二列。如果这就是代码应该做的全部,那么它可以替换为:

awk -F, '{print $2}' /some_directory/directory/file_in_question.csv

答案 1 :(得分:1)

类似的东西:

IFS=","
tail /var/log/httpd/error_log | while read foo bar
do
    echo $foo
done

我建议您使用read进行bash拆分,而不是在那里低效调用awk。显然,将整个内容重写为awk脚本将比shell更快,但是awk更难用于普通语言。

答案 2 :(得分:0)

或者这个。

while : 
do read l || { sleep 1 ; continue; }
   echo "==> $l"
done < /var/log/httpd/error_log