区切り文字の前にn文字のない行をすべて削除します。

区切り文字の前にn文字のない行をすべて削除します。

非常に長いテキストファイルがあります(ここ)には6つの16進文字を含める必要があり、「break」(1文字で表示され、以下のコードマークダウンでは正しく表示されないようです)といくつかの単語を含める必要があります。

00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
5080    Cisco Systems, Inc
0E+00   ASUSTek COMPUTER INC.
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
2354    ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

私は周りを見回し、この場合に何がうまくいくのか見ていませんでした。私の質問は、/ / grep/を使用して、このテキストファイルの "break"の後に6つの16進文字で始まらないすべての行を削除するにはどうすればよいですかsedawkperl

000000PSボーナスポイントを取得するには、FFFFFF16進文字(例:->)に基づいてアルファベット順と数字順にファイルを並べ替える最良の方法は何ですか?ただ使用する必要がありますかsort

ベストアンサー1

$ awk '$1 ~ /^[[:xdigit:]]{6}$/' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

awkこれは、最初のフィールドに正確に6つの16進数を含む行を抽出するために使用されます。パターン[[:xdigit:]]は16進数と一致し、{6}6つが必要です。フィールドの始まりと終わりをそれぞれ使用して固定するだけで、必要な^$だけが一致します。

新しい名前で保存するには、ファイルにリダイレクトします。

awkこれはGNU(Linuxでは一般的)では動作するようですが、awkOpenBSDまたはmawk


同様の方法sed:

$ sed -n '/^[[:xdigit:]]\{6\}\>/p' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

この式では、\>16進数の終わりと一致します。これは次のことを保証します。もっと長く数値が一致しません。この\>パターンは次のように一致します。単語の境界、単語文字と単語以外の文字の間の幅がゼロの空白。


結果データをソートするには、 trough を介して結果をパイプするか、sort16sort -f進数で大文字と小文字の両方を使用する場合

おすすめ記事