grep y tabs: no coinciden

#cat sample 1 -1 2 2 2 2 2 1-1 3 

Necesito get todas las líneas que contiene valor negativo, que es la primera línea sólo. Los valores están separados por tabuladores. Primero lo intenté

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

Pero si lo bash

  grep "\t\-1" sample 

No tengo nada (no hay partido). ¿Qué estoy haciendo mal?

En Bash, puedes hacer esto:

 grep $'\t-1' sample 

El $'' hace que escapes sean interpretados.

No es necesario escaping del signo less.

Intente algo como:

 grep -P '\t-1' sample 

Por cierto, la muestra que has proporcionado está con tabs. Puede intentar lo siguiente para hacer coincidir los espacios en blanco generics:

 grep -P '\s-1' sample 

No hay facilidad para \ t ser tabulación en expresiones regulares básicas (las descritas por el man 7 regex ). Como señaló Georgi Hristozov, puede utilizar Perl Compatible Regular Expressions para get esta capacidad. Algunas implementaciones de grep no soportarán -P, pero otras herramientas básicas tendrán más lenguajes de expresión regulares ricos, aquí hay algunos ejemplos que deberían funcionar:

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

Con el fin de conseguir que funcione con grep regular (sin usar pcre) vas a tener que poner una expresión de la pestaña literal en su regex. En muchos shells donde la tecla de tabulación hace algo como la finalización, puede get un carácter de tabulación literal con Ctrl-v<tab> . por lo que debería escribir:

 grep 'Ctrl-v<tab>-' sample 

Compruebe el man 7 regex para las expresiones regulares de POSIX que usted puede utilizar, mientras que el -P para PCRE es apoyado en porciones de lugares su no disponible por todas partes (y la página del manual dice su buggy así que no confío siempre en me) en más lugares.

Puede probar algo como esto:

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

^ coincide con el comienzo de la línea.
[[:digit:]]\+ coincide con uno o más dígitos.
[[:space:]]\+ coincide con uno o más caracteres de espacio en blanco.
- finalmente coincide con el valor negativo que estaba buscando.

Página de manual para regex (7): http://linux.die.net/man/7/regex

Solución opcional :

Puede utilizar awk para hacer esto también (y ciertamente otras herramientas). Este es un ejemplo de awk que imprime líneas donde la segunda columna es menor que 0 (negativa):

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