如何使用 while read line with tail -n

How to use while read line with tail -n

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

代码片段:我目前的代码是这样的:

IFS=","
while read line
do

    awk_var=`echo "$line" | awk -F" " '{print [=10=]}'`

    var_array=($awk_var)

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

    echo "${var_array[1]}"


done </some_directory/directory/file_in_question.csv

问题: 在使用 bash 脚本阅读 file_in_question.csv 时,如何使用 tail -n10000while read line

类似于:

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

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

替换:

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 }' /some_directory/directory/file_in_question.csv

或者这个。

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