- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的问题,我有一组大的gz
日志文件,该行中的第一个信息是日期时间文本,例如:2014-03-20 05:32:00。
我需要检查哪些日志文件集包含特定数据。
对于初始化,我只需执行以下操作:
'-query-data-'
zgrep -m 1 '^20140320-04' 20140320-0{3,4}*gz
zcat foo.gz | tail -1
最佳答案
最简单的解决方案是更改日志轮换以创建较小的文件。
第二个最简单的解决方案是使用支持随机访问的压缩工具。
像dictzip,BGZF和csio之类的项目在gzip压缩数据中的各个间隔处都添加了sync flush points,使您可以在程序中寻找有关该额外信息的信息。尽管标准中存在它,但香草gzip
不会默认或通过选项添加此类标记。
这些专用于随机访问的实用程序压缩的文件由于标记本身而稍大(大约2-20%),但完全支持使用gzip
或其他未意识到这些标记的实用程序进行解压缩。
您可以在有关random access in various compression formats的问题上了解更多信息。
还有一个由Peter Cock撰写的“ Blasted Bioinformatics”博客,其中包含有关该主题的几篇文章,包括:
BGZF - Blocked, Bigger & Better GZIP! –具有随机访问权限的gzip(例如dictzip)
Random access to BZIP2? –调查(结果:无法完成,尽管我会在下面进行)
Random access to blocked XZ format (BXZF) –具有改进的随机访问支持的xz
用xz
进行实验xz
(LZMA压缩格式)实际上在每个块级别上具有随机访问支持,但是您只会获得具有默认值的单个块。
档案建立xz
可以将多个档案串联在一起,在这种情况下,每个档案都有自己的块。 GNU split
可以很容易地做到这一点:
split -b 50M --filter 'xz -c' big.log > big.log.sp.xz
split
将
big.log
分成50MB的块(在压缩之前),并通过
xz -c
运行每个块,然后将压缩的块输出到标准输出。然后,我们将该标准输出收集到名为
big.log.sp.xz
的单个文件中。
split -b 50M big.log big.log-part
for p in big.log-part*; do xz -c $p; done > big.log.sp.xz
rm big.log-part*
xz --verbose --list FILE.xz
获取块偏移量列表。如果需要最后一个块,则需要它的压缩大小(第5列)加上36个字节的开销(通过将大小与
hd big.log.sp0.xz |grep 7zXZ
比较来找到)。使用
tail -c
获取该块,并将其通过
xz
传递。由于上述问题需要文件的最后一行,因此我通过
tail -n1
将其通过管道传输:
SIZE=$(xz --verbose --list big.log.sp.xz |awk 'END { print $5 + 36 }')
tail -c $SIZE big.log.sp.xz |unxz -c |tail -n1
--block-size
标志的支持:
xz --block-size=50M big.log
gzip
进行实验
gzip
还支持串联。我(简短地)尝试为
gzip
模仿此过程,但没有任何运气。
gzip --verbose --list
没有提供足够的信息,并且标题似乎太可变以至于找不到。
apt-get install dictzip
并用dictzip玩,但是只有一点点。没有参数就无法工作,创建一个
.dz
和
dictunzip
都无法理解的(大量!)
gunzip
存档。
bzip2
进行实验
bzip2
具有我们可以找到的标题。这仍然有些混乱,但是可以。
xz
过程一样:
split -b 50M --filter 'bzip2 -c' big.log > big.log.sp.bz2
xz
慢得多(bzip2为48分钟,xz为17分钟,而
xz -0
为1分钟),并且也大得多(bzip2为97M,
xz -0
为25M,xz为15M)。 ,至少对于我的测试日志文件而言。
GUESS=50000000
LAST=$(tail -c$GUESS big.log.sp.bz2 \
|grep -abo 'BZh91AY&SY' |awk -F: 'END { print '$GUESS'-$1 }')
tail -c $LAST big.log.sp.bz2 |bunzip2 -c |tail -n1
tail
中。
grep
调用将查找标题,该标题将检查整个猜测的空间),所以这是次佳的解决方案。另请参阅以下有关
bzip2
实际速度的部分。
xz
有多快,它很容易成为最佳选择。使用其最快的选项(
xz -0
)可以非常快速地进行压缩或解压缩,并在我正在测试的日志文件上创建比
gzip
或
bzip2
小的文件。其他测试(以及各种在线资源)表明,在所有情况下
xz -0
均优于
bzip2
。
split
加上启动145个压缩实例的开销很小,而不仅仅是启动一个实例(如果它允许其他非多线程实用程序使用多个线程,则甚至可能是纯收益)。
关于bash - 如何zgrep没有尾部的gz文件的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533060/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!