use find e grep para encontrar linhas que contenham alguma string e não contenham outra string de arquivos

1

Primeiro, eu tento o seguinte código

find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"

Na pasta atual, recebo a lista com a extensão do nome do arquivo "cfg". Então eu quero pesquisar o conteúdo para encontrar linhas contendo o "bom", mas não começar com "#". Mas meu código não funciona. Há algo de errado? Obrigado.

    
por yuxuan 08.12.2015 / 16:46

2 respostas

1

Algo como o seguinte deve funcionar:

find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'

Note que mudei para -print0 para evitar problemas com nomes de arquivos contendo espaço em branco.

Em seguida, eu filtro linhas contendo good , mas não começando com # em um regexp único. A alternativa à esquerda ( [^#].* ) corresponde às linhas que comece com um caractere que não seja # , em que a alternativa correta (vazia) permite linhas de correspondência que começam com good .

Usar um único regexp, em vez de dois como na sua pergunta, nos permite para deixar nomes de arquivos de impressão GNU grep (o que fará se mais de um arquivo é fornecido por find ). Adicionando grep -v ^... em um segundo passo não corresponderia ao início das linhas do arquivo.

    
por 08.12.2015 / 16:58
3

Uso inútil de xargs (se sua localização tiver -exec):

find . -name "*.cfg" -exec egrep "^[^#]*good" {} +

O cursor não precisa ser mascarado - não conheço nenhuma circunstância em que deva ser. Mas não é de mal e todo o seu comando funciona para mim.

    
por 08.12.2015 / 16:55

Tags