Grep 3 Letras Maiúsculas e Dígitos em Duas Variáveis [fechadas]

1

Eu criei um script que usa for loop para percorrer um script da IBM para obter o tamanho dos diretórios. O script então exibe o tamanho e o caminho do diretório para um canal Slack para facilitar a visualização. O programa funciona, mas a saída do script IBM é grande e precisa ser formatada para facilitar a leitura no Slack. assim Eu preciso coletar duas informações que serão canalizadas em duas variáveis separadas com as variáveis sendo usadas para criar a mensagem Slack. Meu script parece:

SIZE () {
  for dir in /path/to/dir/*
  do
    cd /usr/lpp/mmfs/samples/ilm/
    SLACKMESSAGE=$(./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h)
    SLACK
  done
}

Portanto, /path/to/dir/* é o diretório pai e o script da IBM ./mmpolicy-du.sample "$dir" -t /mmfs1/.policytmp -g /mmfs1/.policytmp/ -N all -v -h irá percorrer todos os direcotries filhos (um nível de profundidade) e obter seu tamanho. A saída se parece com:

[I] 2018-05-31@16:32:55.798 Policy execution. 0 files dispatched.
[I] 2018-05-31@16:32:55.804 Policy execution. 0 files dispatched.
File system scan complete.
534.5M     total
mmapplypolicy du for /path/to/directory/SPI/ complete at Thu May 31 17:32:55 2018

Essa não é a saída mais limpa, portanto, gostaria de canalizar o tamanho do diretório no exemplo de exemplo 534.5M para uma variável chamada SIZE e a SPI para outra variável chamada PROJECT . Claro que, sendo um loop, a variável SIZE e PROJECT mudará em cada diretório dentro do exemplo acima de /path/to/dir/ . A função Slack que é chamada na minha função acima usará essas duas variáveis. Eu estou lutando para descobrir como colocar esses dois em variáveis. Alguém tem uma solução? Obrigado!

    
por sark 31.05.2018 / 18:46

2 respostas

0

Para fazer de uma só vez:

eval "$(yourscript | awk -v q=\' '
  $1 ~ /^[[:digit:]]+(\.[[:digit:]]+)?[MGT]$/ {
    print "SIZE=" $1
  }
  match($0, /[[:upper:]]{3}/) {
    print "PROJECT="q substr($0, RSTART, RLENGTH) q
  }')"

Observe que algumas implementações com awk , como nawk ou Solaris, mawk ou versões mais antigas de gawk , não suportam os operadores de intervalo de expressão regular {x,y} / {x} (no caso de mais antigos (e não antigas) versões de gawk , você pode executá-lo com POSIXLY_CORRECT=anything no ambiente para suportá-las embora), embora tenha sido padrão por mais de 25 anos agora. Com eles, você precisaria substituir [[:upper:]]{3} por [[:upper:]][[:upper:]][[:upper:]] .

    
por 31.05.2018 / 19:48
0

Eu duvido muito que isso seja o que você precisa, mas isso responde a você a pergunta atual na íntegra.

Primeira parte (assumindo o GNU grep ou compatível):

project="$(yourscript|grep -oE '[[:upper:]]{3}')"

Segunda parte:

size="$(yourscript|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"

Combinado, é mais simples executar o script uma vez, salvar a saída e o grep e atribuir na saída salva:

output="$(script)"
size="$(printf '%s\n' "$output"|grep -oE '[[:digit:]]+(\.[[:digit:]]+)?[MGT]')"
project="$(printf '%s\n' "$output"|grep -oE '[[:upper:]]{3}')"

Alguma explicação de grep -o - apenas retorna o objeto grepped, não a linha inteira% -E - Regex estendido em [[:upper:]] - corresponde apenas a letras maiúsculas ([AZ], mas independentemente de locale) {3} - limita a correspondência com exatamente 3 caracteres consecutivos. [[:digit:]] - corresponde a dígitos ([0-9], novamente sem considerar a localidade)
+ - correspondência 1 ou mais vezes em \. - corresponde a um ponto em (...)? - corresponde a 0 ou 1 vezes - isso garante que os números sem um ponto decimal também possam ser capturados em [xy] - correspondido exatamente a um dos itens x ou y.

    
por 31.05.2018 / 19:34

Tags