Sınırlayıcıdan önce n karakteri olmayan tüm satırları sil


11

( Ondan sonra) altı onaltılık karakter sonra bir 'sonu' (ki bir karakter olarak görünür ve aşağıdaki kod işaretleme düzgün görünmüyor gibi görünüyor) birkaç kelime içermelidir çok uzun bir metin dosyası var :

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

Biraz etrafa baktım ve bu durumda işe yarayacak bir şey göremiyorum. Benim sorum, bu metin dosyasının tam olarak 6 onaltılık karakterle ve ardından bir 'sonu' ile başlamayan tüm satırlarını silmek için grep/ sed/ awk/ nasıl kullanabilirim perl?

PS Bonus puanları için, dosyayı alfabetik ve sayısal olarak onaltılı karakterlere göre sıralamanın en iyi yolu nedir (yani 000000-> FFFFFF)? Sadece kullanmalı mıyım sort?

Yanıtlar:


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

Bu awk, ilk alanda tam olarak altı onaltılık basamak içeren satırları ayıklamak için kullanılır. [[:xdigit:]]Desen onaltılık rakamla eşleşir {6}Altısını gerektirir. Alanın başlangıcına ve sonuna sabitleme ile birlikte ^ve $sırasıyla, bu sadece istenen hatlarda eşleşecektir.

Yeni bir adla kaydetmek için bazı dosyalara yönlendirin.

Bunun GNU awk(Linux'ta yaygın olarak bulunur) ile çalıştığını , ancak awkOpenBSD veya ile çalışmadığını unutmayın mawk.


Benzer bir yaklaşım 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

Bu ifadede, \>onaltılı sayının sonunu eşleştirmek için kullanılır. Bu, daha uzun sayıların eşleşmemesini sağlar. \>Deseni ile eşleşen kelime sınır örneğin bir kelime karakter ve bir sözcük olmayan karakteri arasında sıfır genişliği alanı.


Sonuçta elde edilen verileri sıralamak için, sonuç oluğuna yöneltmeniz sortveya sort -fonaltılı sayılarınız hem büyük hem de küçük harfler kullanıyorsa


1
Harika, çok teşekkür ederim. Tam aradığım şey!
Rocco

8

Ve bütünlük için, bunu grep ile de yapabilirsiniz:

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

Bu genişletilmiş grep ifadesi, her satırın başında tam olarak 6 onaltılık basamak arar ve hemen ardından boşluktan beyaza sınır ( \b) gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.