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


11

私は非常に長いテキストファイル(ここから)を作成し、6つの16進文字と「改行」(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/ sed/ awk/ perlそれから、正確に6進数の文字と「ブレーク」で始まっていない、このテキストファイルのすべての行を削除するには?

PSボーナスポイントについて、ファイルを16進文字に従ってアルファベット順および数値順に並べ替える最良の方法は何ですか(つまり000000-> FFFFFF)。使用するだけsortですか?

回答:


13
$ 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が必要です。^およびで$それぞれフィールドの開始と終了へのアンカーと一緒に、これは必要な行でのみ一致します。

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

これは、GNU awk(Linuxでよく見られます)で動作するようですがawk、OpenBSDやなどでは動作しないように注意してください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進数の末尾を照合するために使用されます。これにより、長い数字が一致しないことが保証されます。\>パターンが一致したワード境界すなわち単語文字と非単語の文字の間にゼロ幅スペースを。


得られたデータをソートするため、単にパイプ結果トラフsort、またはsort -fあなたの16進数は、上下両方のケースの文字を使用する場合


1
完璧です、どうもありがとう。まさに私が探していたもの!
ロッコ

8

完全を期すために、grepでもこれを行うことができます。

$ grep -E '^[[:xdigit:]]{6}\b' oui.txt 
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
$ 

この拡張grep式は、各行の先頭で正確に6桁の16進数を検索し、直後に非空白から空白への境界(\b)が続きます。

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