GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Grep-Zeilen beginnend mit 1, aber nicht 10, 11, 100 usw

Die Frage im Körper

Wählen Sie Zeilen aus, die mit 1 beginnen und gefolgt von einem Leerzeichen

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

Das ergibt auch die Anzahl der Zeilen (ohne den Aufruf von wc zu benötigen)

Die Frage im Titel

Eine 1 nicht gefolgt von einer anderen Zahl (oder nichts):

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

Aber beide oben genannten Lösungen haben einige interessante Probleme, lesen Sie weiter.

Im Hauptteil der Frage behauptet der Benutzer, dass die Datei "tabulatorgetrennt" ist.

Trennzeichen

Tab

Eine Zeile, die mit einem 1 beginnt gefolgt von einem Tabulator (ein tatsächlicher Tabulator im Befehl). Dies schlägt fehl, wenn das Trennzeichen ein Leerzeichen ist (oder irgendein anderes oder keins):

grep '^1    ' file

Leerzeichen

Eine Zeile, die mit 1 beginnt gefolgt von einem Leerzeichen (ein tatsächliches Leerzeichen im Befehl). Dies schlägt fehl, wenn das Trennzeichen ein anderes oder keins ist.:

grep '^1 ' file

Tab oder Leerzeichen

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

Leerzeichen

Eine flexiblere Option besteht darin, mehrere Leerzeichen (horizontal und vertikal) einzuschließen. Die [:space:] Zeichenklassensatz besteht aus (Leerzeichen), \t (horizontaler Tabulator), \r (Wagenrücklauf),\n (Zeilenumbruch), \v (vertikaler Tabulator) und \f (Formular-Feed). Aber grep kann nicht mit einem Zeilenumbruch übereinstimmen (es ist eine interne Beschränkung, die nur mit -z umgangen werden könnte Möglichkeit). Es ist möglich, es als Beschreibung für das Trennzeichen zu verwenden. Es ist auch möglich und kürzer, die von GNU verfügbare Abkürzung von \s zu verwenden :

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

Diese Option schlägt jedoch fehl, wenn das Trennzeichen so etwas wie ein Doppelpunkt : ist oder ein anderes Satzzeichen (oder ein beliebiger Buchstabe).

Grenze

Oder wir können den Übergang von einer Ziffer zu einer „keine Ziffer“-Grenze verwenden, eigentlich „ein Zeichen, das nicht in [_[:alnum:]] enthalten ist (_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).

Dies akzeptiert als gültige Zeilen, die mit einer 1 beginnen und von einem Satzzeichen gefolgt werden.


Klingt so, als wollten Sie nur das:

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

Für den zählenden Teil davon:

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

Mit awk :

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

Linux
  1. Auflisten aller E-Mail-Adressen in einer Datei mit grep

  2. Zeilen zwischen (und einschließlich) zwei Mustern drucken?

  3. Zeilen drucken, wenn angegebene Spalte mit einem Großbuchstaben beginnt?

  4. Wie kann man eine Datei ausgeben und Zeilen ignorieren, die mit „?“ beginnen?

  5. Entfernen Sie leere Zeilen in einer Textdatei mit grep

Das Grep-Befehls-Tutorial mit Beispielen für Anfänger

Bearbeiten von Text mit sed und grep

Wie kopiere ich eine Datei, die mit einem Punkt beginnt?

Wie kann man eine Datei zeilenweise abschneiden?

Mit Feldtrenner sortieren

Die Servicedatei ist vorhanden, wird aber von systemd nicht gefunden