procure um arquivo e crie um novo arquivo somente se uma condição for atendida

10

Eu tenho um arquivo de log e quero pesquisar por uma sequência e somente se essa sequência for encontrada um novo arquivo a ser criado. Como posso conseguir isso, sed doenst parece ser adequado neste caso.

Jacknife
fonte
3
Use greppara pesquisar. A -qopção suprimirá toda a saída e retornará correspondência / não correspondência através grepdo código de saída, que é facilmente testável.
waltinator
2
Pode ser útil nos dizer qual é a condição.
J0h

Respostas:

16

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

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

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


Você também pode optar pela touch /newfileabordagem usual , ou bashum redirecionamento vazio - >/newfiletambém.

Apenas para observar, se o arquivo já existir, touchapenas as alterações de data e hora serão alteradas sem truncar o arquivo. E o redirecionamento vazio >/newfilenão é suportado em todos os shells on-the-go (por exemplo, in zsh), para os quais você deve enviar manualmente o EOF.

heemail
fonte
O que :faz?
George Udosen
5
@George :é uma abreviação para true, é um comando não-op, que sempre sai com status de saída 0.
heemayl
@heemayl Isso funcionou melhor até hoje
Jacknife
6

Apenas por diversão:

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

em que 'string'é substituído pela string (condição), 'logfile'é substituído pelo caminho para o arquivo de log, 'newfile'é substituído pelo caminho real do arquivo a ser criado, tudo entre aspas simples, como no exemplo.

Jacob Vlijm
fonte
4

Você pode usar o awk com seu system()comando. Se /pattern/for encontrado, o código bloqueado {}será executado, neste caso, chamamos touch /tmp/my_file.txtvia system()comando.

O exemplo abaixo mostra a criação de um arquivo temporário se houver meu usuário presente /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 arquivar:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
fonte
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á no local.

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

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
fonte