Como pesquisar entre o segundo e terceiro delimitadores

0

Então, eu tenho um arquivo de dados e gostaria que uma correspondência ocorresse somente se uma correspondência fosse encontrada entre a segunda e a terceira barras verticais (|)

Então, dado este exemplo de dados, eu, se eu procurar por 'wilson', quero que a segunda linha retorne, mas não a terceira e a quinta linha, que também contêm o termo 'wilson'.

A amostra de dados:

| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |
    
por Off The Gold 26.08.2015 / 20:03

2 respostas

3

Para sua entrada de amostra:

$ cat /tmp/data
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |

Você pode usar o awk:

$ awk '-F|' 'BEGIN { OFS = "|" }{ if ($3 ~ "wilson") { print }  }' /tmp/data
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |

Em vez de $3 ~ "wilson" , você também pode usar $3 == " wilson " , supondo que sempre haverá espaços ao redor do campo.

Para responder à sua pergunta de acompanhamento, você pode envolvê-la em um script Bash:

$ cat foo.sh
#/bin/bash
names="$(cat patlist.txt)"

for name in ${names}; do
    awk -F'|' '$3 == " '"${name}"' "' /tmp/data
done

$ cat patlist.txt
wilson
jones

$ bash foo.sh
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
    
por 26.08.2015 / 20:19
0

O mais fácil seria vincular o regex a outro campo, por exemplo :[0-9][0-9] | wilson , embora isso corra riscos falsos positivos. Mais complicado seria usar awk e dividir os dados em colunas, depois aplicar o regex em awk apenas na segunda coluna.

    
por 26.08.2015 / 20:11