如何使用 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 -n10000
和 while 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
问题: 我有一个 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 -n10000
和 while 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