Hapus semua baris yang tidak memiliki n karakter sebelum pembatas

11

Saya memiliki file teks yang sangat panjang (dari sini ) yang harus berisi 6 karakter heksadesimal kemudian 'break' (yang muncul sebagai satu karakter dan tampaknya tidak muncul dengan benar dalam penurunan kode di bawah) diikuti oleh beberapa kata:

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

Saya telah melakukan beberapa melihat sekeliling dan tidak dapat melihat sesuatu yang akan berhasil dalam situasi ini. Pertanyaan saya adalah, bagaimana saya bisa menggunakan grep/ sed/ awk/ perluntuk menghapus semua baris file teks ini yang tidak dimulai dengan tepat 6 karakter heksadesimal dan kemudian 'break'?

PS Untuk poin bonus, apa cara terbaik untuk menyortir file secara alfabet dan numerik sesuai dengan karakter hex (yaitu 000000-> FFFFFF)? Haruskah saya gunakan sort?

Rocco
sumber

Jawaban:

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

Ini digunakan awkuntuk mengekstrak garis yang berisi tepat enam digit heksadesimal di bidang pertama. The [[:xdigit:]]pola cocok dengan digit heksadesimal, dan {6}membutuhkan enam dari mereka. Bersama dengan penahan ke awal dan akhir lapangan dengan ^dan $masing - masing, ini hanya akan cocok pada garis yang diinginkan.

Arahkan ke beberapa file untuk menyimpannya di bawah nama baru.

Perhatikan bahwa ini tampaknya bekerja dengan GNU awk(umumnya ditemukan di Linux), tetapi tidak dengan awkpada misalnya OpenBSD, atau mawk.


Pendekatan serupa dengan 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

Dalam ungkapan ini, \>digunakan untuk mencocokkan ujung angka heksadesimal. Ini memastikan bahwa angka yang lebih panjang tidak cocok. The \>pola cocok dengan batas kata , yaitu ruang nol-lebar antara karakter kata dan karakter non-kata.


Untuk mengurutkan data yang dihasilkan, cukup pipakan palung hasil sort, atau sort -fjika angka heksadesimal Anda menggunakan huruf besar dan kecil

Kusalananda
sumber
1
Sempurna, terima kasih banyak. Persis apa yang saya cari!
Rocco
8

Dan untuk kelengkapan, Anda dapat melakukan ini dengan grep juga:

$ 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
$ 

Ekspresi grep yang diperluas ini mencari tepat 6 digit hex pada awal setiap baris, diikuti segera oleh batas non-spasi-putih-ke-spasi putih ( \b).

Trauma Digital
sumber