#tac #reverse #simd #utilities #core #coreutils

tac-k-lib

按逆序打印文件中的行

2 个版本

0.3.3 2024 年 5 月 31 日
0.3.2 2024 年 5 月 30 日

#2248命令行工具


tac-k 使用

MIT/Apache

23KB
263

Tack

Crates.io Version docs.rs Crates.io License Crates.io MSRV

Tack 是 tac crate 的一个分支。它可以作为独立的二进制文件 tac-k 和库 tac-k-lib 使用。

Tack 是一个高性能、SIMD 加速、跨平台的 GNU Coreutils 中的 tac 工具 重写版本,许可协议为 MIT/Apache-2.0。 tac 从文件(或从 stdin,但 见下文)读取输入,然后按行反向打印。

tac 实现使用 SIMD 指令集(AVX2、NEON)以加速新行的检测,并在所有支持的操作系统上利用内存映射文件。此外,它用 Rust 编写,以确保最大程度的完整性和安全性。

谁还需要一个更快的 tac 呢?

这是个好问题。尝试按逆时间顺序搜索一个多吉字节大小的网站访问日志文件(tac --line-buffered access.log | grep foo),然后告诉我。

用法

Usage: tac [OPTIONS] [FILE]...

Arguments:
  [FILE]...  Files to be reversed.
             Read from stdin if it is `-` or not specified.

Options:
  -s, --separator <BYTE>  Use BYTE as the separator instead of newline.
                          Only single-byte character is supported.
      --line-buffered     Always flush output after each line
  -h, --help              Print help
  -V, --version           Print version

Tack 从任何组合的 stdin 和/或零个或多个文件中读取行,并将行按逆序写入输出。

示例

$ echo -e "hello\nworld" | tac
world
hello

$ echo -e "hello\nworld" | tac --separator=o
rld
wohello%

安装

可以通过 cargo,Rust 包管理器来构建和安装 tack 二进制文件

cargo install tac-k --locked

或通过预构建的二进制文件使用 cargo-binstall 安装

cargo binstall tac-k --locked

可以通过以下方式将 tack 库添加到您的项目中

cargo add tac-k-lib

实现说明

tac 实现使用 SIMD 指令集(AVX2、NEON)以加速新行的检测,如果可用。此外,使用内存映射文件通过避免因启用推测执行缓解而导致的读取输入时的上下文切换而导致的性能下降来提升性能。与随 GNU Coreutils 一起发布的 tac 版本相比,它显著(如果禁用缓解则为 2.55 倍,否则更多)更快,并且许可协议更宽松。

为了获得最佳性能

  • 请尽量不要将输入管道传递给 tac。例如,不要运行 cat /usr/share/dict/words | tac,而是直接运行 tac /usr/share/dict/words。因为根据定义,tac 必须到达文件末尾才能反向输出其输入,如果您使用 tacstdin 接口(例如 cat foo | tac),它必须在开始处理结果之前缓冲所有 stdin 输入。 tac 将尝试在内存中缓冲,但一旦超过某个高水位线(目前为 4 MiB),它将切换到基于磁盘的缓冲(因为它无法知道输入的大小或它是否会超过可用的空闲内存)。
  • 尽可能将 tac 放在管道的 开始。即使您可以保证 tac 的输入不会超过内存缓冲限制(见上文),tac 仍然几乎肯定比您管道中的任何其他命令都要快,如果您打算反向输出,您将从开始反向输出中获得最大的好处,除非您总是要运行到命令完成。例如,不要运行 grep foo /var/log/nginx/access.log | tac,而是运行 tac /var/log/nginx/access.log | grep foo。这将(显著)减少报告前 n 个匹配项所需的时间和/或工作量(因为文件首先被快速反向,然后按所需顺序搜索,而不是慢慢搜索整个文件,然后再反向结果)。
  • 如果 tac 是将输出管道传递给另一个命令而不是直接写入 tty,请使用行缓冲输出模式(tac -l -line-buffered)。这为您提供“实时”结果流,并允许您在仅查找前 n 个匹配项时更快地终止。例如,tac -l -line-buffered access.log | grep foo 将比 tac access.log | grep foo 更快地打印其第一个匹配项。
  • 同样,如果您正在链式连接 n 个实用工具的输出,请确保前 n - 1 个命令都使用行缓冲模式,除非您不关心延迟而只关心吞吐量。例如,要打印某些 grep 模式的第一个两个匹配项:tac -l -line-buffered access.log | grep -l -line-buffered foo | head -n2

许可证

Tack 既可以使用 MIT 许可证,也可以使用 Apache-2.0 许可证,您可以选择。

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在本软件包中的任何贡献,都将按上述方式双重许可,不附加任何额外的条款或条件。

贡献

作为一个开源项目,如果没有来自各个贡献者的不懈努力,Tack 将无法存在 - 请参阅 CONTRIBUTORS.md 以获取详细信息。

依赖关系

~165KB