我有一个~23000行的SQL转储包含几个数据库的数据.我需要提取此文件的某个部分(即单个数据库的数据)并将其放在一个新文件中.我知道我想要的数据的起始行和结束行号.
有没有人知道一个Unix命令(或一系列命令)从第16224和16482行之间的文件中提取所有行,然后将它们重定向到一个新文件?
sed -n '16224,16482p;16483q' filename > newfile
从sed手册:
p - 打印出图案空间(到标准输出).此命令通常仅与-n命令行选项一起使用.
n - 如果未禁用自动打印,则打印图案空间,然后,无论如何,将图案空间替换为下一行输入.如果没有更多输入,那么sed退出而不再处理任何命令.
q - 退出
sed
而不处理更多命令或输入.请注意,如果未使用-n选项禁用自动打印,则会打印当前模式空间.
和
sed脚本中的地址可以采用以下任何一种形式:
number 指定行号仅匹配输入中的该行.
可以通过指定用逗号(,)分隔的两个地址来指定地址范围.地址范围匹配从第一个地址匹配的行开始,并继续直到第二个地址匹配(包含).
sed -n '16224,16482 p' orig-data-file > new-file
16224,16482是起始行号和结束行号,包括在内.这是1索引的. -n
抑制将输入作为输出回显,这显然是你不想要的; 数字表示使以下命令操作的行数范围; 该命令p
打印出相关的行.
使用头/尾非常简单:
head -16482 in.sql | tail -258 > out.sql
使用sed:
sed -n '16482,16482p' in.sql > out.sql
使用awk:
awk 'NR>=10&&NR<=20' in.sql > out.sql
您可以使用'vi'然后使用以下命令:
:16224,16482w!/tmp/some-file
或者:
cat file | head -n 16482 | tail -n 258
编辑: - 只是添加说明,你使用head -n 16482显示第一个16482行然后使用tail -n 258来获得第一个输出中的最后258行.
还有另一种方法awk
:
awk 'NR==16224, NR==16482' file
如果文件很大,那么exit
在读完最后一行后可能会很好.这样它就不会不必要地读取文件直到最后:
awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file
perl -ne 'print if 16224..16482' file.txt > new_file.txt
# print section of file based on line numbers sed -n '16224 ,16482p' # method 1 sed '16224,16482!d' # method 2
cat dump.txt | head -16224 | tail -258
应该做的伎俩.这种方法的缺点是你需要做算术来确定尾部的参数,并考虑你是否希望'between'包括结束行.
sed -n '16224,16482p' < dump.sql
我站在Boxxar的肩膀上,像这样:
sed -n ',$p; q' input
例如
sed -n '16224,$p;16482q' input
的$
意思是“最后行”,所以第一个命令使sed
打印开始的行中的所有行16224
和所述第二命令使sed
退出后打印线16428
。(添加1
为q
在boxxar的解决方案-范围似乎没有必要。)
我喜欢这种变体,因为我不需要两次指定结束行号。而且我测量到使用$
不会对性能产生不利影响。