我有一个30GB的磁盘分区的磁盘映像(想dd if=/dev/sda1 of=diskimage
),我需要恢复一些文本文件。 数据雕刻工具像foremost
只适用于具有明确定义的头文件,即不是纯文本文件,所以我已经退缩在我的好朋友strings
。
strings diskimage > diskstrings.txt
生成了一个3gb的文本文件,其中包含一些string,大部分没用的东西,与我真正想要的文本混合在一起。
大部分的垃圾往往是非常长的,不间断的乱码。 我感兴趣的东西是保证less于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()
这是有效的,但为了将来的参考:是否有任何神奇的单行咒语(想awk
, sed
),将过滤文件的行长?
awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt
会打印比16千字节短的行,就像你自己的例子。
或者如果你喜欢Perl:
perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt
这与Ansgar的答案类似,但是在我的testing中稍微快一点:
awk 'length($0) < 16384' infile >outfile
这与其他awk的答案速度相同。 它依赖于一个真实expression式的隐式print
,但是不需要像Ansgar那样花费时间来分割线条。
请注意,AWK给你一个免费的。 上面的命令相当于:
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
你可以awk
如:
$ awk '{ if (length($0) < 16384) { print } }' /path/to/text/file
这将打印比16K字符(16 * 1024)更长的行。
你也可以使用grep
:
$ grep ".\{,16384\}" /path/to/text/file
这将打印最多16K字符的行。
与已经给出的答案没有什么不同,但更短:
awk -F '' 'NF < 16384' infile >outfile