Sed
Linux shell 命令按行長過濾文本文件
我有一個 30gb 的 borked 分區(想想
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()
這可行,但供將來參考:是否有任何神奇的單行咒語(想想
awk
,sed
)可以按行長過濾文件?
awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt
將列印小於 16 KB 的行,如您自己的範例中所示。
或者如果你喜歡 Perl:
perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt
這類似於 Ansgar 的答案,但在我的測試中略快:
awk 'length($0) < 16384' infile >outfile
它與其他 awk 答案的速度相同。它依賴於隱含
請注意,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