Sed

Linux shell 命令按行長過濾文本文件

  • March 9, 2016

我有一個 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()

這可行,但供將來參考:是否有任何神奇的單行咒語(想想awksed)可以按行長過濾文件?

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 答案的速度相同。它依賴於隱含print的真實表達式,但不需要像 Ansgar 那樣花時間分割線。

請注意,AWKif免費為您提供。上面的命令等價於:

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

引用自:https://serverfault.com/questions/355321