Criando Funções com Bash Scripting

2

Eu desenvolvi o código abaixo, eu gostaria de melhorar este código para necessidades futuras. Então, estou pensando que, se eu usar funções, o código poderia ser muito melhor do que agora e ele parecerá organizado.

Então, como eu mudei para um programa ou bloco de código organizado?

Poderia, por favor, me ajudar?

Versão: Servidor Red Hat Enterprise Linux versão 7.3 (Maipo)

(a saída deve ser a mesma)

 #!/bin/bash

 hammer host list >| host.list
 cat host.list | grep "RHEL Server" | awk -F'|' '{ print $3}' |  sort > 
 host.modified1
 grp='sort host.modified1 | uniq -c'
 echo "Linux Versions Grouped by Count" > host.modified1
 echo "" >> host.modified1
 echo "$grp"  >> host.modified1
 echo "" >> host.modified1
 echo "Linux Versions and Hostnames" >> host.modified1
 echo "" >> host.modified1
 cat host.list | grep "RHEL Server" | awk -F'|' '{ print $3"|"$2  }' | sort 
 >> host.modified1

saída;

  Linux Versions Grouped by Count

  8  RHEL Server 6.5  
 21  RHEL Server 6.6  
  1  RHEL Server 6.7  
 10  RHEL Server 6.8  
 39  RHEL Server 6.9  
 19  RHEL Server 7.2  
 34  RHEL Server 7.3  
 30  RHEL Server 7.4  


Linux Versions and Hostnames

RHEL Server 6.5  | xxx.dnsname 
    
por bbenzer 08.03.2018 / 08:48

2 respostas

1

Você poderia definitivamente colocar isso em uma função se você quisesse. Aqui está um exemplo onde eu também tentei reduzir o processamento que você está fazendo. Como não sei como é a saída de hammer host list , fiz sugestões do que seu código original fez.

do_stuff () {    
    local tmpfile=$(mktemp)
    hammer host list | grep -F 'RHEL Server' >"$tmpfile"

    printf 'Linux Versions Grouped by Count\n\n'
    awk -F '|' '{ c[$3]++ } END { for (h in c) printf("%d\t%s\n", c[h], h) }' "$tmpfile" | sort -k 2

    printf '\n\nLinux Versions and Hostnames\n\n'
    awk -F '|' '{ printf("%s | %s\n", $3, $2) }' "$tmpfile" | sort

    rm -f "$tmpfile"
}

do_stuff >rhel_things.txt

A função grava tudo na saída padrão e você redireciona essa saída ao chamar a função. Ele usa um arquivo temporário para armazenar a hammer output e exclui essa saída quando ela é executada.

Se você quiser dividir ainda mais:

pre_parse () {    
    local tmpfile=$(mktemp)
    hammer host list | grep -F 'RHEL Server' >"$tmpfile"

    printf '%s\n' "$tmpfile"
}

do_group_counts () {
    local infile="$1"

    printf 'Linux Versions Grouped by Count\n\n'
    awk -F '|' '{ c[$3]++ } END { for (h in c) printf("%d\t%s\n", c[h], h) }' "$infile" | sort -k 2
}

do_ver_and_hosts () {
    local infile="$1"

    printf 'Linux Versions and Hostnames\n\n'
    awk -F '|' '{ printf("%s | %s\n", $3, $2) }' "$infile" | sort
}

tmpfile=$( pre_parse )

{
    do_group_counts "$tmfile"
    printf '\n\n'
    do_ver_and_hosts  "$tmpfile"
} >rhel_stuff.out

rm -f "$tmpfile"
    
por 08.03.2018 / 09:08
0

Acho que posso fazer isso em um único programa awk , conforme abaixo. À primeira vista, ele parecerá mais longo do que realmente é, porque usa nomes extensos de variáveis descritivas e é consciencioso sobre liberar memória imediatamente quando possível.

  1. awk possui funções de classificação nativa integradas, portanto, não há necessidade de canalizar para um programa externo.

  2. As funções awk asort e asorti também recebem um terceiro argumento opcional, sendo o método de classificação , que pode ser coisas como @ind_num_asc , @ind_num_desc , @ind_num_asc , @ind_num_desc , etc. para várias maneiras de classificar em ordem crescente ou decrescente. Como de costume, veja a página man .

  3. O programa está repleto de instruções delete para ser atencioso com o uso da memória, o que pode se tornar um problema à medida que os conjuntos de dados aumentam.

  4. É uma pena que você não nos forneceu dados de entrada de amostra para brincar. Eu me diverti muito codificando isso, mas só Deus sabe quão perto está de trabalhar sem dados de entrada, então trate o código abaixo como uma prova de conceito que pode precisar de trabalho para funcionar. O take-away básico é que o método mais eficiente é provavelmente todo interno para um único programa awk .

hammer host list \ | awk -F'|' ' \ BEGIN {i=0} /RHEL Server/ { unsorted_count[$3]++ unsorted_list[i++]=$3"|"$2 } END { printf "\nLinux Versions Grouped by Count\n\n" i=0 for (release in unsorted_count) count_list[i++]=unsorted_count[release]"\t"release delete unsorted_count n=asort(count_list,sorted_count) delete count_list for (i=1; i<=n; i++) printf "%s\n", sorted_count[i] delete sorted_count printf "\n\nLinux Versions and Hostnames\n\n" i=0 for (hostname in unsorted_list) host_list[i++]=unsorted_list[hostname]" | "hostname delete unsorted_list n=asort(host_list,sorted_list) delete host_list for (i=1; i<=n; i++) printf "%s\n", sorted_list[i] }'

    
por 08.03.2018 / 10:34