テキストファイルを行の長さでフィルタリングするLinuxシェルコマンド


19

dd if=/dev/sda1 of=diskimageテキストファイルを復元する必要がある、破損したパーティションの30 GBのディスクイメージがあります(考えてみてください)。データカービングツール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()

これは機能しますが、将来の参考のために:行の長さでファイルをフィルタリングする魔法のような1行の呪文(考えるawksed)がありますか?

回答:


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

あなたの例のように、16キロバイトより短い行を印刷します。

または、Perlを空想した場合:

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

まあ、それは恥ずかしいほど簡単でした。ありがとうございました。:)
李アウンイップ

Perlバージョンも追加しました:-)
ヤンネピッカライネン

また、awk 'length($0) < 16384' file > outputデフォルトのアクションは行を出力することであるため、awkスクリプトはと書くことができます。
グレンジャックマン

8

これはアンスガーの答えに似ていますが、私のテストではわずかに高速です:

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

2

あなたはできる awkような:

$ awk '{ if (length($0) < 16384) { print } }' /path/to/text/file

これにより、16K文字(16 * 1024)よりも短い行が印刷されます。

以下grepも使用できます。

$ grep ".\{,16384\}" /path/to/text/file

これにより、行が最大16K文字で印刷されます。


grepそのような良いアイデアは確かではありません-確かに単純な正規表現ですが、よりも計算コストが高くなりawkます。「問題のある人は「正規表現を使用します!」と言います。今、彼には2つの問題があります。」;)
Li-aung Yip

それは別の方法です。私が投稿した最初のオプションはを使用することawkでした。
ハレド

1
正規表現の+1。ゴルフが良くなり、awkのマンページが読めなくなるからです=)
Ciro Santilli新疆改造中心法轮功六四事件

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.