ibrahim Asked: 2010-01-13 05:33:37 +0800 CST2010-01-13 05:33:37 +0800 CST 2010-01-13 05:33:37 +0800 CST 从文件中读取指定范围的行 772 我有一个包含 100000 行的文件,如何在 linux 下获取从 line#5555 到 line#7777 的行。 谢谢大家。 linux files sed 4 个回答 Voted Kyle Brandt 2010-01-13T05:43:10+08:002010-01-13T05:43:10+08:00 sed '5555,7777!d' <filename> 这将打印文件的第 5555-7777 行(包括)。 丹尼斯发布了以下我同意应该更快的内容: sed '5555,7777p; 7778q' filename 以下证据表明它应该更快: $ n=1 $ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done $ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2 $ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2 $ wc -l sed1 149 sed1 $ wc -l sed2 14 sed1 仅在 Bash 中(为了好玩): n=1 while read line; do if [[ ($n -ge 5555) && ($n -le 7777) ]]; then echo $line elif [[ $n -gt 7777 ]]; then break fi n=$(( $n + 1 )) done < file Dennis Williamson 2010-01-13T06:00:06+08:002010-01-13T06:00:06+08:00 完成后退出可以加快速度: sed -n '5555,7777p; 7778q' input_file Chopper3 2010-01-13T05:43:59+08:002010-01-13T05:43:59+08:00 这些中的任何一个都应该起作用; sed -n '开始编号,结束编号p' awk 'NR>= startnumber &&NR<= endnumber ' 文件 顺便说一句,这是个好问题;) Dave Crooke 2014-11-04T09:32:34+08:002014-11-04T09:32:34+08:00 我发现 sed 选项不适用于 mysqldump 文件,我猜是由于处理了引用的换行符或多字节字符。head 和 tail 使用与 grep 相同的行号对其进行切片,这正是我所需要的。要获得 $j 到 $k 的行,您需要: x=$(( $k - $j + 1 )) tail -n +$j filename | head -${x}
这将打印文件的第 5555-7777 行(包括)。
丹尼斯发布了以下我同意应该更快的内容:
sed '5555,7777p; 7778q' filename
以下证据表明它应该更快:
仅在 Bash 中(为了好玩):
完成后退出可以加快速度:
这些中的任何一个都应该起作用;
顺便说一句,这是个好问题;)
我发现 sed 选项不适用于 mysqldump 文件,我猜是由于处理了引用的换行符或多字节字符。head 和 tail 使用与 grep 相同的行号对其进行切片,这正是我所需要的。要获得 $j 到 $k 的行,您需要: