带偏移的 Linux 头/尾
Posted
技术标签:
【中文标题】带偏移的 Linux 头/尾【英文标题】:Linux head/tail with offset 【发布时间】:2014-10-07 12:20:12 【问题描述】:在 Linux 中有没有一种方法可以请求头部或尾部,但需要忽略额外的记录偏移量。
例如,如果文件example.lst
包含以下内容:
row01
row02
row03
row04
row05
我使用 head -n3 example.lst
可以获得第 1 - 3 行,但如果我希望它跳过第一行并获得第 2 - 4 行怎么办?
我问是因为某些命令的标题可能在搜索结果中并不理想。例如du -h ~ --max-depth 1 | sort -rh
将返回主目录中所有文件夹的目录大小,按降序排序,但会将当前目录附加到结果集的顶部(即~
)。
Head 和 Tail 手册页似乎没有任何偏移参数,所以也许有某种range
命令可以指定所需的行:例如range 2-10
什么的?
【问题讨论】:
【参考方案1】:来自man tail
:
-n, --lines=K
output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth
因此,您可以使用 ... | tail -n +2 | head -n 3
从第 2 行开始获取 3 行。
非头/尾方法包括sed -n "2,4p"
和awk "NR >= 2 && NR <= 4"
。
【讨论】:
+1 你也可以awk 'NR>4exitNR>=2'
在第四行之后退出。
wtf 这个答案毫无意义——我们如何使用head
或tail
来获取范围。我希望这个答案中有一个例子,比如tail -n 5 -l 5
第一个选项是从哪里开始第二个是多少
@MrCholo 答案解释了如何,但如果不清楚,你可以给我一个行范围,我会给你头+尾组合来提取它
好吧,我知道如果你这样做:tail -n 10 | head -n 5
,它将读取“倒数第二组 5”,但是,想象一个更大的数字。 tail -n 1000 | head -n 5
,现在它必须读取 1000 条速度较慢的东西。我正在寻找一个可以执行此操作且仅读取 5 行的命令。类似range --start '-1000' --end '-1005'
,注意负数
文件不可行寻址。如果您想按行号访问行而不从头或尾读取文件,则必须提前索引文件,或使所有行的长度已知。【参考方案2】:
要获取 2 到 4 之间的行(包括两者),您可以使用:
head -n4 example.lst | tail -n+2
或
head -n4 example.lst | tail -n3
【讨论】:
【参考方案3】:花了很多时间才最终得到这个解决方案,它似乎是唯一一个涵盖所有用例的解决方案(到目前为止):
command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=$MAX_LINES:-200 \
'
if (NR <= offset) print;
else
a[NR] = $0;
delete a[NR-offset];
printf "." > "/dev/stderr"
END
print "" > "/dev/stderr";
for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
print a[i]
'
功能列表:
head 的实时输出(显然 tail 是不可能的) 不使用外部文件 stderr 上的进度条,MAX_LINES 之后的每一行一个点,对于长时间运行的任务非常有用。 避免由于缓冲 (stdbuf) 而导致的错误记录顺序【讨论】:
【参考方案4】:sed -n 2,4p somefile.txt
#填充
【讨论】:
以上是关于带偏移的 Linux 头/尾的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ELF 文件格式 ( 程序头偏移量 | 节区头偏移量 | 处理器特定标志 | ELF 文件头大小 )
Android 逆向ELF 文件格式 ( 程序头偏移量 | 节区头偏移量 | 处理器特定标志 | ELF 文件头大小 )