我有一个包含 100000 行的文件,在 Linux 下我怎样才能获取从第 5555 行到第 7777 行的行。
谢谢大家。
答案1
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
答案2
完成后退出可以加快速度:
sed -n '5555,7777p; 7778q' input_file
答案3
这两种方式都可以;
- sed -n '起始号码,尾数磷'
- awk 'NR>=起始号码&&NR<=尾数' 文件
顺便说一句,这个问题问得好 ;)
答案4
我发现 sed 选项在 mysqldump 文件上不起作用,我猜是因为处理带引号的换行符或多字节字符。head 和 tail 使用与 grep 相同的行号对其进行切片,这正是我所需要的。要获取行 $j 到 $k,您需要:
x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x}