Grep para filtrar e mostrar apenas o início de uma linha

Grep para filtrar e mostrar apenas o início de uma linha

(usando MacOSX e pode converter isso em um script perl). Sou bastante novo nos comandos Linux/Unix e minha pesquisa no Google não teve êxito.

Estou criando um script para agilizar a busca por um registro do treinamento de alguém. A forma como estou fazendo isso é listando os registros de treinamento do indivíduo em uma linha (talvez haja uma maneira melhor?). Quando uso o Grep para procurar um nome específico, posição treinada ou data, ele mostra a linha inteira. Quero fazer uma busca grep por uma string específica e mostrar apenas o início da linha, ou seja: as 2 primeiras palavras (Nome/Sobrenome).

O arquivo Training.txt é semelhante a este:

Ivie, Shawn Caixa 24/05/2016 Almoxarifado 02/12/2016 Balcão de atendimento 31/11/2016

Allen, Adam Caixa 10/05/2016 Almoxarifado 13/12/2016

Martinez, Jessica Caixa 20/05/2017 Almoxarifado 29/10/2016 Supervisor 23/01/2016

O comando que uso agora é: grep "Cashier" Training.txt

que retorna todos os 3 registros, todo o conteúdo da linha de todos os registros.

Eu tentei: grep -E -o ".{0,0}Cashier.{0,5}" Training.txt

que retorna (neste exemplo, todos os 3 registros), mas mostrando zero caracteres antes de "Caixa" e 5 depois.

Cashier 5/10

Como posso incorporar um grep (ou talvez um comando Perl) para procurar, por exemplo, "Supervisor" e mostrar apenas as 2 primeiras palavras (nomes)? Secundário: alguma ideia que possa facilitar esse tipo de processo? (A planilha simplesmente não é útil neste caso).

Responder1

Isso é perfeito para awk:

awk '/Supervisor/ { print $1, $2 }' /path/to/inputfile

Você pode até restringir a pesquisa ao terceiro campo para não obter um falso positivo para alguém chamado "Supervisor Bob":

awk '$3 ~ /Supervisor/ { print $1, $2 }' /path/to/inputfile

Responder2

Você pode usar grepcom o Perlmodo ativado:

grep -oP '^(\S+,?\s+){2}(?=Cashier\s)'

Resultados

Ivie, Shawn
Allen, Adam
Martinez, Jessica

Trabalhando

  • No modo Perl, grep procura dois campos (\S+) desde o início da linha.
  • E estando no final do espaço em branco do 2º campo, se conseguirmos ver um Caixa seguido de um espaço em branco, encontramos a nossa correspondência. Como a string do Caixa é apenas uma olhada, ela não será incluída na correspondência.

informação relacionada