pesquisa um arquivo e cria um novo arquivo somente se uma condição for atendida

10

Eu tenho um arquivo de log e quero procurá-lo por uma string e somente se essa string for encontrada, um novo arquivo será criado. Como posso conseguir isso, o sed doen parece estar se encaixando nesse caso.

    
por Jacknife 25.01.2017 / 15:38

4 respostas

16

Tack uma avaliação de curto-circuito após grep :

grep -q 'search_pattern' /file && : >/newfile
  • grep -q não produz saída no STDOUT, apenas sai com o status de saída 0 se o padrão for encontrado no arquivo

  • Se o padrão for encontrado ( && ), crie um arquivo /newfile by : >/newfile .

Você também pode usar a abordagem usual touch /newfile ou, em bash , um redirecionamento vazio - >/newfile também.

Apenas para observar, se o arquivo já existir, então touch alteraria apenas os registros de data e hora relevantes sem truncar o arquivo. E o redirecionamento vazio >/newfile não é suportado em todas as shells on-the-go (por exemplo, em zsh ), onde você precisa enviar manualmente o EOF.

    
por heemayl 25.01.2017 / 15:46
6

Apenas por diversão:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

onde 'string' é substituído pela sequência (condição), 'logfile' é substituído pelo caminho para o arquivo de log, 'newfile' é substituído pelo caminho real para o arquivo a ser criado, todos entre aspas simples, lik em o exemplo.

    
por Jacob Vlijm 25.01.2017 / 16:10
4

Você pode usar o awk com seu comando system() . Se o /pattern/ for encontrado, o codeblock {} será executado, neste caso chamamos o comando touch /tmp/my_file.txt via system() .

O exemplo abaixo mostra a criação de um arquivo temporário se houver meu usuário presente em /etc/passwd .

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Como alternativa, poderíamos usar o redirecionamento para o arquivo:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
    
por Sergiy Kolodyazhnyy 25.01.2017 / 16:01
0

Você não diz se deseja um novo arquivo vazio ou se precisa de um processamento mais complexo para criar o arquivo.

Se o primeiro, a resposta de @heemayl está correta.

Caso contrário, use uma declaração if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
    
por Paddy Landau 31.01.2017 / 09:51