给定一个长度未知的文本文件,我如何读取,例如,所有的 但是文件的前2行?我知道 tail会给我最后 N 行,但我不知道提前 N 是什么。
tail
为了一个文件
AAAA BBBB CCCC DDDD EEEE
我想
CCCC DDDD EEEE
还有一份文件
AAAA BBBB CCCC
我会得到公正
CCCC
使用它,假设第一个示例名为 sample1.dat,然后是 tail --lines=3 sample1.dat,它将打印从第3行到最后一行的所有行。
tail --lines=3 sample1.dat
对于第二个示例,再次假设它被称为 sample2.dat,它将是 tail --lines=-1 sample2.dat,它将打印最后一行..。
tail --lines=-1 sample2.dat
tail -n +linecount filename将从 filename的 linecount行开始输出,因此 tail -n +3 filename 你想怎么做就怎么做。
tail -n +linecount filename
filename
linecount
tail -n +3 filename
tail --help提供以下信息:
tail --help
-n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth
因此,为了过滤掉第一个 2行,-n +3应该提供所需的输出(从第3行开始)。
2
-n +3
假设您的 tail 版本支持它,您可以在 X 行之后指定启动尾部。在你的情况下,你会做2 + 1。
tail -n +3 [mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt CCCC DDDD EEEE
我真的不知道如何做到这一点,只是从尾部或头部,但与 wc -l(行计数)和 bash 表达式的帮助下,你可以做到这一点。
wc -l
tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE
Hope this helps.
一个使用 awk 的简单解决方案:
awk 'NR > 2 { print }' file.name
使用 awk 获取除最后两行之外的所有内容
awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file
除了前两行以外,其他的都看完了
awk 'NR>2' file
或者你可以使用更多
more +2 file
或者只是猛击
#!/bin/bash i=0 while read -r line do [[ $i > 1 ]] && echo "$line" ((i++)) done <"file"
尝试 sed 1,2d。根据需要替换2。
sed 1,2d
head函数支持负数。
head
head --help -n, --lines=[-]K print the first K lines instead of the first 10; with the leading '-', print all but the last K lines of each file
例如,正数打印前2行。
head -n +2 AAAA BBBB
负数打印 第一2行的所有 除了。
head -n -2 CCCC DDDD EEEE
注意,与 tail不同,这不需要事先知道文件中的行总数。不管有多少行,它都会排除前2行。类似地,tail -n -2的负数也可以用来删除文件的 最后2行。
tail -n -2
注意,这里使用的是 GNU head 版本8.22。这个特性在最初发布时可能不可用。现在即使相当老的 Linux 发行版也可以使用它。