Retorna apenas o número da linha, se o padrão 'Exist' e 'Not Exist'. usando o comando 'grep'

1

Eu tenho este arquivo de amostra para minha entrada:

xyxxyx xyxx xxyx yxyy yxyx
xxyxxx xx xyx xxx x y x xxyy
yxxy xyxxy xxy y x y
xyxy xyx yyxx xyyxyxy xyx
yxyy xyy yxyx xxyxyyx

E tentei encontrar apenas "xyx" word se existir na linha e retornar o número da linha. por exemplo, nesta entrada, apenas a linha 2 e 4 tem "xyx" , e o resultado desejado é apenas 2 e 4 (números de linha), mas grep me dá todas as 5 linhas. este resultado:

grep -n "xyx" test | cut -f1 -d:
1
2
3
4
5

Se eu executar o comando de acompanhamento sem cut -f1 -d" , verei todos os "xyx" , como "xyxxyx" , "xyxx" , "xxyx" e "yxyx" , por exemplo, na primeira linha, enquanto isso está errado. padrão só e existem apenas na linha 2 e 4 e é terceira palavra na linha 2 e segunda & amp; 5ª palavra na linha 4. Veja a captura de tela:

E o resultado que eu quero é, encontrar apenas "xyx" e retornar o número da linha.

saída do desejado se existir padrão, é apenas:

2
4

saída do desejado se o padrão não existir, é apenas:

1
3
5

e também não sei qual comando devo usar para verificar se o padrão não existe. Eu tentei com todas as combinações possíveis do comando grep , mas falhei.

Obrigado por ajudar antecipadamente.

    
por αғsнιη 04.09.2014 / 22:36

1 resposta

2

Você precisa adicionar a opção -w

$ grep -wn 'xyx' file | cut -d: -f1
2
4

De man grep

   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.

Para inverter a correspondência, adicione a opção -v , ou seja,

grep -vwn 'xyx' file | cut -d: -f1
    
por steeldriver 04.09.2014 / 22:44