Li-*_*Yip 19 awk sed filter strings
我有一个 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()
Run Code Online (Sandbox Code Playgroud)
这有效,但供将来参考:是否有任何神奇的单行咒语(想想awk, sed)可以按行长度过滤文件?
Jan*_*nen 30
awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt
Run Code Online (Sandbox Code Playgroud)
将打印短于 16 KB 的行,如您自己的示例所示。
或者如果你喜欢 Perl:
perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt
Run Code Online (Sandbox Code Playgroud)
Den*_*son 12
这类似于 Ansgar 的答案,但在我的测试中略快:
awk 'length($0) < 16384' infile >outfile
Run Code Online (Sandbox Code Playgroud)
它与其他 awk 答案的速度相同。它依赖于print真实表达式的隐式,但不需要像 Ansgar 那样花时间拆分行。
请注意,AWK 为您提供了一个if免费的。上面的命令等效于:
awk 'length($0) < 16384 {print}' infile >outfile
Run Code Online (Sandbox Code Playgroud)
没有if像其他一些答案那样明确(或其周围的花括号)。
这是一种方法sed:
sed '/.\{16384\}/d' infile >outfile
Run Code Online (Sandbox Code Playgroud)
或者:
sed -r '/.{16384}/d' infile >outfile
Run Code Online (Sandbox Code Playgroud)
删除任何包含 16384(或更多)字符的行。
为完整起见,以下是sed用于保存超过阈值的行的方法:
sed '/^.\{0,16383\}$/d' infile >outfile
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24604 次 |
| 最近记录: |