GNU/Linux >> Linux Esercitazione >  >> Linux

Linee grep che iniziano con 1, ma non 10, 11, 100 ecc

La domanda nel corpo

Seleziona le righe che iniziano con 1 e sono seguiti da uno spazio

grep -c '^1\s'          file
grep -c '^1[[:space:]]' file

Ciò fornirà anche il conteggio delle righe (senza bisogno della chiamata a wc)

La domanda nel titolo

Un 1 non seguito da un altro numero (o niente):

grep -cE '^1([^0-9]|$)' file 

Ma entrambe le soluzioni di cui sopra hanno alcuni problemi interessanti, continua a leggere.

Nel corpo della domanda l'utente afferma che il file è "delimitato da tabulazioni".

Delimitatore

scheda

Una riga che inizia con un 1 seguito da una scheda (una scheda effettiva nel comando). Questo fallisce se il delimitatore è uno spazio (o qualsiasi altro, o nessuno):

grep '^1    ' file

spazio

Una riga che inizia con un 1 seguito da uno spazio (uno spazio effettivo nel comando). Questo fallisce se il delimitatore è qualsiasi altro o nessuno.:

grep '^1 ' file

tabulazione o spazio

grep '^1(   | )' file
grep '^1[[:blank:]]' file

spazi bianchi

Un'opzione più flessibile consiste nell'includere diversi caratteri di spazio (orizzontali e verticali). Il [:space:] il set di classi di caratteri è composto da (spazio), \t (scheda orizzontale), \r (ritorno a capo),\n (nuova riga), \v (scheda verticale) e \f (feed modulo). Ma grep non può corrispondere a una nuova riga (è una limitazione interna che potrebbe essere evitata solo con -z opzione). È possibile utilizzarlo come descrizione sul delimitatore. È anche possibile, e più breve, usare la scorciatoia disponibile in GNU \s :

grep -c '^1[[:space:]]` file
grep -c '^1\s'          file

Ma questa opzione fallirà se il delimitatore è qualcosa come i due punti : o qualsiasi altro carattere di punteggiatura (o qualsiasi lettera).

Confine

Oppure, possiamo usare la transizione da una cifra a un limite "non una cifra", beh, in realtà "un carattere non in [_[:alnum:]] (_a-zA-Z0-9 )":

grep -c  '^1\b' file       # portable but not POSIX.
grep -c  '^1\>' file       # portable but not POSIX.
grep -wc '^1'   file       # portable but not POSIX.
grep -c  '^1\W' file       # portable but not POSIX (not match only a `1`) (not underscore in BSD).

Questo accetterà come valide le righe che iniziano con un 1 e sono seguite da qualche carattere di punteggiatura.


Sembra che tu voglia solo questo:

$ grep '^1\b' a
1        TGCAG.....
1        TGCAG......

Per la parte di conteggio di questo:

$ grep -c '^1\b' file
2

Con awk :

awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile

Linux
  1. Elenco di tutti gli indirizzi email in un file con grep

  2. Stampa linee tra (e inclusi) due motivi?

  3. Come Grep Lines che non iniziano con "#" o ";"?

  4. Come contare il numero di righe in un file dopo una corrispondenza Grep?

  5. Core scaricato, ma il file core non si trova nella directory corrente?

Il tutorial sul comando Grep con esempi per principianti

Manipolazione del testo con sed e grep

Come troncare il file per righe?

/etc/passwd mostra l'utente in un gruppo, ma /etc/group no

Il file di servizio esiste ma non viene trovato da systemd

Come ottenere righe che contengono stringhe in un file?