Como egrep o primeiro caractere na segunda coluna?

3

Usando egrep, como posso imprimir todas as linhas onde os sobrenomes começam com K ou k ?

Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
Jennifer Cowan:548-834-2348:583 Laurel Ave., kingsville, TX 83745:10/1/35:58900
Lesley kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
    
por Steve 28.09.2012 / 17:32

2 respostas

3

Uma primeira tentativa seria

  grep '^[^ ]*  *[Kk]'

Mas isso pressupõe que sempre exista exatamente um primeiro nome e nenhuma inicial.
Neste exemplo, você pode usar a opção -i e substituir [Kk] apenas por k

Pode ser melhor usar o primeiro cólon

  grep -i ' k[^:]*:'

Se você realmente quer imprimir apenas o sobrenome, e não a linha inteira, você deve considerar usar o awk (ou perl)

Update: heres como a primeira expressão do grep '^[^ ]* *[Kk]' é construída

  '     apostrophe delimits a parameter that contains spaces
        and other so-called meta-characters that the shell might alter
  ^     caret means start of line
  [     brackets mark a set of characters, any one of which is to be matched
  ^     inside brackets means negation or 'none of the following'
        so '[^ ]' means "not a space"
  ]     is the end of the set.
  *     means 0,1 or more of the prior character
        so '[^ ]*' means any contiguous group of characters that does not 
        contain a space
  then we have two spaces
  *     means 0,1 or more of the prior character
        so space space * means 1 nor more spaces.
  [Kk]  means 'K' or 'k'
  [^:]* means 0,1 or more characters that are not a colon
  :     followed by a colon
    
por 28.09.2012 / 17:36
0
perl -aF/:/ -ne 'print if $F[0] =~ /\s[Kk]\S+$/'
  • Com -aF/:/ , a linha inteira é dividida em campos separados por dois pontos;
  • $F[0] é o campo zeroth e contém os nomes;
  • /\s[Kk]\S+$/ corresponde a um espaço ( \s ), seguido por K ou k , seguido por qualquer número de caracteres não espaciais ( \S+ ) até o final do campo ( $ ).
por 29.09.2012 / 13:20