Problemas com o jogo awk

2

Estou com problemas para tentar corresponder uma string exata com o awk.

Minha intenção é pesquisar um csv em uma partida e obter o número da linha dessa partida. Então, se eu procurar por "1.1.1.2" no arquivo abaixo, eu quero que ele retorne "1"

CSV

[apache@JBLAMPS001 tmp]$ cat test.csv
node2,1.1.1.2
node20,1.1.1.20
node21,1.1.1.21
node22,1.1.1.22
node102,1.1.1.102
node202,1.1.1.202

Coisas que tentei

[apache@JBLAMPS001 tmp]$ awk '/'1.1.1.2'/ {print NR}' test.csv
1
2
3
4
5
6
[apache@JBLAMPS001 tmp]$ awk '/\y'1.1.1.2'\y/ {print NR}' test.csv
1
5
[apache@JBLAMPS001 tmp]$ awk '"^1.1.1.2$" {print NR}' test.csv
1
2
3
4
5
6

Alguém sabe como posso estruturar isso? Obrigado.

    
por Jesse_b 05.07.2017 / 05:48

3 respostas

2

Se você quiser usar o Regex, precisará usar modificadores e âncoras adequados para obter apenas as correspondências desejadas. No seu caso, o padrão Regex 1.1.1.2 ( . significa qualquer caractere único BTW) corresponderá a todas as linhas, daí o resultado. O último é awk '"^1.1.1.2$" {print NR}' não é como você coloca um padrão Regex em awk - você precisa usar // ou $<field> ~ <pattern> .

Veja como você pode obter o resultado desejado:

  • Forma Regex: escape de todos os . s para tratá-los literalmente, adicione $ para corresponder ao final:

    awk '/1\.1\.1\.2$/ {print NR}' test.csv
    
  • Manipulação de strings: imprimindo o número do registro se o , seguido por qualquer espaço em branco separado no último campo for 1.1.1.2 :

    awk -F ',[[:blank:]]*' '$NF == "1.1.1.2" {print NR}' test.csv 
    
por 05.07.2017 / 05:56
0
ip=1.1.1.2; sed -ne "/,${ip//./\.}\$/=" yourIPfile

Onde estamos escapando dos pontos . e damos isso para o comando sed = que exibirá o número da linha correspondente.

    
por 05.07.2017 / 09:04
0

Você sempre pode tentar o bom e velho grep :

grep -wFn 1.1.1.2 yourIPfile

ou

ip=1.1.1.2 ; grep -wFn $ip yourIPfile

Em ambos os casos, a saída é

1:node2,1.1.1.2
    
por 05.07.2017 / 09:52