Shell Script não está reportando corretamente

0

Estou tentando criar um script que monitore os tamanhos dos arquivos e use o ID do trabalho. O problema é que o script retorna apenas o primeiro ID, mesmo se houver vários processos em execução. Alguma idéia de por que isso não está funcionando?

#!/bin/sh
filename='bigfiles'
find /opt/Logs -type f -size +10k > $filename
count='cat bigfiles | wc -l'

while read -r line
do

pid= more "$line" | grep ID | awk -F '=' '{print $2}'>> pid.txt

done < $filename

Além disso, preciso varrer vários diretórios e o script deve verificar os arquivos se o tamanho do arquivo de log atingir 25% da utilização do sistema de arquivos. Alguma sugestão de como posso incorporar isso?

Isso funciona se eu usar em vez de enquanto

 for line in $(cat bigfiles)                                                                                       
  do echo "$line"                                                                                                
  pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt                                  
  kill $(more $line | grep JOBID | awk -F '=' '{print $2}')                                    
  bhist -l $(more $line | grep JOBID | awk -F '=' '{print $2}') >> hist.txt;            
  done                                                                                                                
    
por Vas 31.07.2018 / 22:36

2 respostas

3

É difícil dizer por que seu script se comporta mal, já que não sabemos com o que os arquivos com os quais você está lidando. Tudo o que sabemos é que você está interessado em linhas que contêm a string ID e que você gostaria de obter o que quer que seja depois de um = nessas linhas.

Seu script contém duas variáveis não usadas: count (uma string contendo um comando shell) e pid (uma variável vazia). Você também passa por um bom número de aros para chegar ao que está depois de = :

more "$line" | grep ID | awk -F '=' '{ print $2 }'

O comando more é um pager, o que significa que é um utilitário para arquivos exibindo . Em vez de usar isso, você pode deixar grep ler o arquivo diretamente:

grep ID "$line" | awk -F '=' '{ print $2 }'

Mas isso é apenas permitir que grep faça algo que awk possa fazer por si só,

awk -F '=' '/ID/ { print $2 }' "$line"

Mas podemos fazer melhor que isso. Em vez de salvar todos os nomes de caminhos no arquivo $filename , podemos deixar find fazer todo o trabalho para nós:

find /opt/Logs -type f -size +10k \
    -exec awk -F '=' '/ID/ { print $2 }' {} + >pid.txt

Isso localizará todos os arquivos regulares em ou abaixo de /opt/Logs com tamanho maior que 10 KB. Para cada arquivo, o que está depois (o primeiro) = em cada linha contendo a string ID será impresso. O resultado disso será salvo em pid.txt .

Relacionados:

por 31.07.2018 / 23:03
-1
filename='bigfiles' find /opt/Logs -type f -size +10k > $filename

for line in $(cat bigfiles)

do 
echo "$line"

pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt

kill $(more $line | grep JOBID | awk -F '=' '{print $2}')

bhist -l $(grep JOBID "$line" | awk -F '=' '{print $2}') >> hist.txt;

done
    
por 01.08.2018 / 05:42