bashshell使用BSD头显示文件的第一部分

bashshell使用BSD头显示文件的第一部分,bash,shell,head,bsd,Bash,Shell,Head,Bsd,以下是文件: line1 line2 ⋮ line10 Total Update time 我想要文件的第一部分,除了最后两行 输出应如下所示: line1 line2 ⋮ line10 如何使用BSD head实现这一点?还是其他的单行线 谢谢 类似于 head file.txt -n -2 如果您的head版本允许-2参数,应该可以工作。我的GNU版本的头工作 $ head --version head (GNU coreutils) 5.97 Copyright (C) 2006 F

以下是文件:

line1
line2
⋮
line10
Total
Update time
我想要文件的第一部分,除了最后两行

输出应如下所示:

line1
line2
⋮
line10
如何使用BSD head实现这一点?还是其他的单行线

谢谢

类似于

head file.txt -n -2
如果您的head版本允许-2参数,应该可以工作。我的GNU版本的头工作

$ head --version head (GNU coreutils) 5.97 Copyright (C) 2006 Free Software Foundation, Inc. This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. Written by David MacKenzie and Jim Meyering.
使用awk,这将打印除最后两行之外的所有行

  awk '{a[j++]=$0}END{for(i=0;i<j-2;i++){print a[i]}}' filename
这将获取除最后2行之外的文件

cat file.txt | head-$expr$wc-l file.txt | cut-c-8-2

更改粗体部分以进行修改。

另一个awk选项:

cat <<file>> | awk -v len=$(wc -l <<file>> | awk '{print $1}') 'NR < len - 2 { print $0 }'

这可能适合您:

[root@gc-rhel6-x64]cat文件 第1行 第2行 第3行 第4行 第5行 第6行 第7行 第8行 第9行 第10行

[root@gc-rhel6-x64游乐场]头-`expr\`wc-l第8行

反转文件,删除前两行,然后反转回:

tac file | sed 1,2d | tac

这一概念不需要使用太多的缓冲区,甚至对于管道中的超大文件或无限流也很有用。它应该比目前提供的任何其他解决方案都要好。您也不必等到最后才开始打印行

awk 'BEGIN{X = 2; getline; a[NR % X] = $0; getline; a[NR % X] = $0}{print a[NR % X]; a[NR % X] = $0}'
若考虑到NR的限制,NR也可以用另一个计数器替换,该计数器将自身重置为0。此外,它还取决于awk的实现,它如何在每N行输入上清理自身和重用内存 但是这个概念已经存在了

awk 'BEGIN{X = 2; for(i = 0; i < X; ++i)getline a[i]}{i %= X; print a[i]; a[i++] = $0}'

看看是否需要将i=1更改为i=0:使用$而不是backticks:head-$expr$wc-l