GNU/Linux >> Znalost Linux >  >> Linux

Grep řádky začínající 1, ale ne 10, 11, 100 atd

Otázka v těle

Vyberte řádky, které začínají 1 a za nimi následuje mezera

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

To také poskytne počet linek (aniž byste museli volat na wc)

Otázka v nadpisu

A 1 ne následuje další číslo (nebo nic):

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

Ale obě výše uvedená řešení mají několik zajímavých problémů, čtěte dál.

V těle otázky uživatel tvrdí, že soubor je "oddělovaný tabulátory".

Oddělovač

karta

Řádek začínající 1 následuje karta (skutečná karta v příkazu). To se nezdaří, pokud je oddělovačem mezera (nebo jakákoli jiná nebo žádná):

grep '^1    ' file

mezera

Řádek začínající 1 následuje mezera (skutečná mezera v příkazu). Toto selže, pokud je oddělovač jakýkoli jiný nebo žádný.:

grep '^1 ' file

tabulátor nebo mezera

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

mezera

Flexibilnější možností je vložit několik mezer (horizontálních a vertikálních) znaků. [:space:] sada znakových tříd se skládá z (mezera), \t (horizontální karta), \r (návrat vozíku),\n (nový řádek), \v (svislá karta) a \f (zdroj formuláře). Ale grep nemůže odpovídat novému řádku (je to interní omezení, kterému se lze vyhnout pouze pomocí -z volba). Je možné jej použít jako popis na oddělovači. Je také možné, a to je kratší, použít GNU dostupnou zkratku \s :

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

Tato možnost však selže, pokud je oddělovač něco jako dvojtečka : nebo jakýkoli jiný interpunkční znak (nebo jakékoli písmeno).

Hranice

Nebo můžeme použít přechod z číslice na hranici „není číslice“, tedy vlastně „znak mimo [_[: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).

To bude akceptovat jako platné řádky, které začínají 1 a po kterých následuje nějaký interpunkční znak.


Zní to, že chcete jen toto:

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

Pro tuto část:

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

S awk :

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

Linux
  1. Porovnat adresáře, ale ne obsah souborů?

  2. Tisknout řádky, pokud daný sloupec začíná velkým písmenem?

  3. Jak vytisknout soubor a ignorovat řádky, které začínají „?“?

  1. Vypsáno jádro, ale soubor jádra není v aktuálním adresáři?

  2. Spusťte skript pomocí rc.local:skript funguje, ale ne při spouštění

  3. Jak si vyžádám soubor, ale neuložím jej pomocí Wget?

  1. Jak zkopíruji soubor s názvem začínající tečkou?

  2. Jak zkrátit soubor podle řádků?

  3. /etc/passwd zobrazuje uživatele ve skupině, ale /etc/group nikoli