使用 bash,如何从给定文件的中间进行 awk/grep 并跳过 1Gig 等?换句话说,我不希望 awk/grep 搜索文件的前 1Gig,而是希望从文件的中间开始搜索。
dd你可以这样使用:
# make a 10GB file of zeroes
dd if=/dev/zero bs=1G count=10 > file
# read it, skipping first 9GB and count what you get
dd if=file bs=1G skip=9 | wc -c
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.84402 s, 582 MB/s
1073741824
Run Code Online (Sandbox Code Playgroud)
请注意,我只是演示一个如何轻松跳过 9GB 的概念。实际上,您可能更愿意使用 100MB 内存缓冲区并跳过其中的 90 个,而不是分配整个 GB。因此,在实践中,您可能更喜欢:
dd if=file bs=100M skip=90 | wc -c
Run Code Online (Sandbox Code Playgroud)
另请注意,我通过管道传输wc而不是awk因为我的测试数据不是面向行的 - 它只是零。
或者,如果您的记录大小为 30kB 并且您想要跳过一百万条记录并丢弃诊断输出:
dd if=file bs=30K skip=1000000 2> /dev/null | awk ...
Run Code Online (Sandbox Code Playgroud)
注意:
awk(因为awk没有“看到”它们),并且dd不是“面向行”),但我想这并不重要。还要注意,使用大的块大小通常非常有利。bs=1m count=8因此,如果您想要 8MB,那么使用它会比bs=8 count=1000000使用每次 8 字节进行一百万次写入要好得多。
另请注意,如果您喜欢处理非常大的文件,您可以使用GNU Parallel将它们划分为多个子进程并行处理。例如,以下代码采用我们在开始时创建的 10GB 文件,并启动 10 个并行作业,对每个 1GB 块中的字节进行计数:
parallel -a file --recend "" --pipepart --block 1G wc -c
Run Code Online (Sandbox Code Playgroud)