Encontre com dois grep (contém e não contém) e um awk [duplicado]

0

Gostaria de armazenar em arquivo todos os arquivos de caminho com uma extração específica de conteúdo de arquivo, em que o arquivo contém AAA , mas NÃO BBB .

Eu tentei muitas coisas, mas essa tentativa está perto do meu objetivo:

find /data/my_project -type f -name "*.php" -exec grep -q "AAA" {} \; -exec grep -L "BBB" {} \; -exec awk '/AAA/{print $NF}'> /tmp/tables_names.txt {} \;  -print > /tmp/class_list.txt

Mas ... O resultado contém o arquivo às vezes AAA , AAA AND BBB ..

EDITAR:

Essa é a mesma pergunta que Encontre arquivos que contenham uma string e não contenham outra , mas onde não há resposta validada, foi realmente difícil de ler. 75% da minha resposta foi de fato lá desculpe ... Mas, eu gostaria de retornar não apenas os caminhos de arquivos correspondentes, mas uma extração (pedaço de texto) desse arquivo correspondente!

    
por Delphine 07.03.2018 / 15:22

4 respostas

4

Localizando todos os arquivos regulares com nomes de arquivos correspondentes a *.php em ou abaixo de /data/my_project que contenham AAA , mas não BBB , e armazenando os nomes de caminho em /tmp/class_list.txt :

find /data/my_project -type f -name '*.php' \
    -exec grep -qF 'AAA' {} ';' \
    ! -exec grep -qF 'BBB' {} ';' \
    -print >/tmp/class_list.txt
    
por 07.03.2018 / 15:36
2
Solução

find + awk :

find /data/my_project -type f -name "*.php" -exec \
awk '/AAA/{ a=1 }/BBB/{ b=1 }END{ exit (!a || (a && b)) }' {} \; -print > /tmp/class_list.txt
    
por 07.03.2018 / 15:37
1

Tente isto:

find /data/my_project -type f -name '*.php' -exec \
bash -c 'grep -q AAA "$1" && ! grep -q BBB "$1" && echo "$1"' -- {} \; \
> /tmp/class_list.txt
    
por 07.03.2018 / 15:29
0
find .... -name '*.php' \
   -exec awk -v RS="
find .... -name '*.php' \
   -exec awk -v RS="%pre%" '/AAA/ && !/BBB/{print FILENAME}' {} \; >  out
" '/AAA/ && !/BBB/{print FILENAME}' {} \; > out
    
por 07.03.2018 / 18:24

Tags