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.
command-line
Jacknife
fonte
fonte
grep
para pesquisar. A-q
opção suprimirá toda a saída e retornará correspondência / não correspondência atravésgrep
do código de saída, que é facilmente testável.Respostas:
Realize uma avaliação de curto-circuito após
grep
:grep -q
não produz saída em STDOUT, apenas sai com o status de saída0
se o padrão for encontrado no arquivoSe o padrão for encontrado (
&&
), crie um arquivo/newfile
por: >/newfile
.Você também pode optar pela
touch /newfile
abordagem usual , oubash
um redirecionamento vazio ->/newfile
também.Apenas para observar, se o arquivo já existir,
touch
apenas as alterações de data e hora serão alteradas sem truncar o arquivo. E o redirecionamento vazio>/newfile
não é suportado em todos os shells on-the-go (por exemplo, inzsh
), para os quais você deve enviar manualmente o EOF.fonte
:
faz?:
é uma abreviação paratrue
, é um comando não-op, que sempre sai com status de saída 0.Apenas por diversão:
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.fonte
Você pode usar o awk com seu
system()
comando. Se/pattern/
for encontrado, o código bloqueado{}
será executado, neste caso, chamamostouch /tmp/my_file.txt
viasystem()
comando.O exemplo abaixo mostra a criação de um arquivo temporário se houver meu usuário presente
/etc/passwd
.Como alternativa, poderíamos usar o redirecionamento para arquivar:
fonte
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:
fonte