Создание функций с помощью сценариев Bash

проблема заключается в

cmd2=meminfo > /tmp/top.txt

это фактически устанавливает переменную cmd2 в meminfo и оценивает перенаправление. вы должны процитировать это.

cmd2='meminfo > /tmp/top.txt'

edit: это создает файл на цели. согласно вашему собственному ответу, вы хотели создать его на системе, которая запускает скрипт (не указано в вашем первоначальном вопросе). причина все еще актуальна, но решение нет.

2
08.03.2018, 09:48
2 ответа

Definitivamente podrías poner esto en una función si quisieras. Aquí hay un ejemplo en el que también he tratado de reducir el procesamiento que está haciendo. Como no sé cómo se ve la salida de hammer host list, hice conjeturas a partir de lo que hizo su código original.

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

La función escribe todo en la salida estándar y usted redirige esa salida cuando llama a la función. Utiliza un archivo temporal para almacenar la salida hammery elimina esta salida una vez que termina.


Si desea desglosarlo más:

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"
1
27.01.2020, 22:18

Creo que puedo hacerlo en un solo programa awk, como se muestra a continuación. A primera vista, parecerá más largo de lo que realmente es, porque usa nombres de variables descriptivos largos y es consciente de liberar memoria inmediatamente cuando sea posible.

  1. awktiene potentes funciones de clasificación nativas incorporadas, por lo que no es necesario conectarse a un programa externo.

  2. awkLas funciones asorty asortitambién toman un tercer argumento opcional, siendo el método de clasificación , que puede ser cosas como @ind_num_asc, @ind_num_desc, @ind_num_asc, @ind_num_desc, etc. para varias formas de clasificar en orden ascendente o descendente. Como de costumbre, consulte la página man.

  3. El programa está repleto de declaraciones deletepara tener en cuenta el uso de la memoria, lo que podría convertirse en un problema a medida que crecen los conjuntos de datos.

  4. Es una pena que no nos haya dado datos de entrada de muestra para jugar. Pasé un buen rato codificando esto, pero solo Dios sabe qué tan cerca está de trabajar sin datos de entrada, así que trate el código a continuación como una prueba -de -concepto que puede necesitar trabajo para, um, trabajo. La conclusión básica -es que el método más eficiente es probablemente todo interno a un solo 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] }'

0
27.01.2020, 22:18

Теги

Похожие вопросы