Linux shell 命令按行长度过滤文本文件

Linux shell 命令按行长度过滤文本文件

我有一个损坏分区(假设)的 30gb 磁盘映像,dd if=/dev/sda1 of=diskimage我需要从中恢复一些文本文件。数据雕刻工具foremost只适用于具有明确定义的标题的文件,即不是纯文本文件,所以我只好求助于我的好朋友strings

strings diskimage > diskstrings.txt生成了一个 3gb 的文本文件,其中包含一堆字符串,大部分是无用的东西,与我真正想要的文本混合在一起。

大多数垃圾文件往往都是很长的、不间断的乱码字符串。我感兴趣的内容保证小于 16kb,所以我将按行长过滤文件。下面是我用来执行此操作的 Python 脚本:

infile  = open ("infile.txt" ,"r");
outfile = open ("outfile.txt","w");
for line in infile:
    if len(line) < 16384:
        outfile.write(line)
infile.close()
outfile.close()

这有效,但供将来参考:是否有任何神奇的单行咒语(想想awksed)可以按行长度过滤文件?

答案1

awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt

将打印短于 16 千字节的行,如您自己的示例所示。

或者如果你喜欢 Perl:

perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt

答案2

这与安斯加(Ansgar)的答案类似,但在我的测试中速度稍快一些:

awk 'length($0) < 16384' infile >outfile

它的速度与其他 awk 答案相同。它依赖于print真表达式的隐式,但不需要像 Ansgar 那样花时间来分割行。

请注意,AWK 免费为您提供if。上述命令相当于:

awk 'length($0) < 16384 {print}' infile >outfile

与其他一些答案不同,这里没有明确的if(或其周围的花括号)。

以下是一种实现方法sed

sed '/.\{16384\}/d' infile >outfile

或者:

sed -r '/.{16384}/d' infile >outfile

删除包含 16384 个(或更多)字符的任何行。

为了完整起见,您可以使用以下方法sed来保存长度超过阈值的行:

sed '/^.\{0,16383\}$/d' infile >outfile

答案3

与已经给出的答案并没有什么不同,但更短:

awk -F '' 'NF < 16384' infile >outfile

答案4

如果您需要根据最小和最大长度进行过滤:

awk 'length($0) <= 256 && length($0) >= 32' input.txt > output.txt

相关内容