Como encontrar linhas contendo mais de 100 caracteres e contém “se”?

7

Então, provavelmente eu deveria usar grep para isso. Contanto que eu precise de pesquisa recursiva, devo usar grep -r . Mas então eu não sei o que devo fazer em seguida;)

Como posso fazer isso?

    
por pushandpop 10.12.2015 / 14:14

5 respostas

7

Você pode usar dois greps conectados por um pipe:

grep -r '.\{100\}' /path | grep 'if'

Para excluir arquivos com if em seus caminhos ou nomes, use ':.*if' em vez de 'if' (ainda pode ser quebrado se seus nomes de arquivos ou caminhos contiverem dois pontos).

    
por 10.12.2015 / 14:21
13

Com grep s que suportam as opções -r (recursiva) e -P (PCRE) (ou pcregrep com -r ):

grep -rP '^(?=.{101}).*?if' .

Ou POSIXly:

find . -type f -exec awk 'length > 100 && /if/ {
   print FILENAME ": " $0}' {} +

(note que o comportamento variará entre implementações para arquivos que não sejam de texto (arquivos que não contenham caracteres, valores de zero bytes, linhas muito longas ou dados após a última nova linha) .Além disso, observe que algumas implementações grep pesquisarão arquivos não regulares ou seguirão links simbólicos).

    
por 10.12.2015 / 14:57
12

Use o awk para contar o tamanho de $ 0 e a presença de substring se?
awk '( length($0) > 100 && index($0,"if") ){print}' file

Se "if" deve ser uma palavra (em oposição a uma substring simples), você pode usar awk '( length($0) > 100 && match($0,/\<if\>/) ){print}' file

    
por 10.12.2015 / 14:25
4

Adaptado de Encontre linhas que excedam um determinado comprimento qualquer um dos itens a seguir funcionará para encontrar linhas com mais de 100 caracteres

grep '.\{100\}' file

perl -nle 'print if length$_>99' file

awk 'length($0)>99' file

sed -n '/.\{100\}/p' file

escolheu o seu método preferido e canalizou-o através de grep if

    
por 10.12.2015 / 14:21
3

com um único grep :

grep -vxE '.{0,99}|([^i]|i[^f])*i*' <in >out

que seleciona apenas linhas que não podem ser descritas da cabeça à cauda com qualquer uma das instruções. e, portanto, qualquer linha que possa ser descrita como consistindo de 0 a 99 caracteres não será selecionada e, da mesma forma, qualquer linha que corresponda a mais de 99 caracteres e ainda não contenha pelo menos uma única se também não pode ser selecionado.

printf '^%-100b$\n' 'if\nif' 'hey if' i if |
grep -nvxE '.{0,99}|([^i]|i[^f])*i*'
3:^hey if                                                                                              $
5:^if                                                                                                  $

talvez seja melhor usar apenas dois grep s.

    
por 11.12.2015 / 09:04