grep și tabs: nu se potrivesc (Administrarea sistemului, Linux, Bash, Grep)

Putnik a intrebat.
#cat sample
1   -1  2
2   2   2
2   1-1 3

Am nevoie să obțin toate liniile care conțin valoare negativă, adică doar prima linie. Valorile sunt separate prin tabulație.mai întâi am încercat

# grep "-1" sample
1   -1  2
2   1-1 3

Dar dacă încerc

 grep "t-1" sample

nu obțin nimic (no match). Ce fac greșit?

Comentarii

  • stackoverflow.com/questions/1825552/grep-a-tab-in-unix –  > Por Ciro Santilli新疆棉花TRUMP BAN BAD.
4 răspunsuri
Dennis Williamson

În Bash, puteți face acest lucru:

grep $'t-1' sample

La adresa $'' face ca scăpările să fie interpretate.

Nu este necesar să scăpați semnul minus.

Comentarii

  • Asta îmi amintește: toată lumea ar trebui să meargă și să (re)citească documentația Bash din când în când. De fiecare dată descoperi într-un fel ceva ce nu știai înainte. –  > Por cjc.
  • Funcționează și asta, mulțumesc. Din păcate, nu pot marca mai mult de 1 răspuns ca fiind acceptat. –  > Por Putnik.
Georgi Hristozov

Încearcă ceva de genul:

grep -P 't-1' sample

Apropo, exemplul pe care l-ați furnizat este cu tabulație. Puteți încerca următorul lucru pentru potrivirea generică a spațiilor albe:

grep -P 's-1' sample

stew

Nu există nicio facilitate pentru ca t să fie tab în expresiile regulate de bază (cele descrise de man 7 regex). După cum a subliniat Georgi Hristozov, puteți utiliza expresiile regulate compatibile cu Perl pentru a obține această abilitate. Unele implementări ale grep nu vor suporta -P, dar alte instrumente de bază vor avea limbaje de expresii regulate mai bogate, iată câteva exemple care ar trebui să funcționeze:

sed -n '/t-/p' sample
awk '/t-/' sample
perl -ne '/t-/ && print' sample

Pentru ca aceasta să funcționeze cu grep regulat (fără a folosi pcre) va trebui să puneți o expresie de tabulare literală în regex-ul dumneavoastră. În multe shell-uri în care tasta de tabulare face ceva de genul finalizării, puteți obține un caracter de tabulare literal cu Ctrl-v<tab>. astfel încât ați putea tasta:

grep 'Ctrl-v<tab>-' sample

Mattias Ahnberg

Verificați man 7 regex pentru expresiile regulate POSIX pe care le puteți utiliza, în timp ce -P pentru PCRE este suportată în multe locuri, nu este disponibilă peste tot (iar pagina de manual spune că este plină de erori, așa că nici eu nu am întotdeauna încredere în ea), cele POSIX ar trebui să funcționeze în mai multe locuri.

Puteți încerca ceva de genul acesta:

grep "^[[:digit:]]+[[:space:]]+-"

^ se potrivește la începutul liniei.
[[:digit:]]+ se potrivește cu una sau mai multe cifre.
[[:space:]]+ se potrivește cu unul sau mai multe caractere de spațiu alb.
- în cele din urmă se potrivește cu valoarea negativă pe care o căutați.

Pagina de manual pentru regex(7): http://linux.die.net/man/7/regex

Soluție opțională:

Puteți folosi awk pentru a face acest lucru (și cu siguranță și alte instrumente). Acesta este un exemplu awk care tipărește liniile în care a doua coloană este mai mică decât 0 (negativ):

awk '{if ($2 < 0) print}'

Tags:, ,