проблема заключается в
cmd2=meminfo > /tmp/top.txt
это фактически устанавливает переменную cmd2
в meminfo и оценивает перенаправление. вы должны процитировать это.
cmd2='meminfo > /tmp/top.txt'
edit: это создает файл на цели. согласно вашему собственному ответу, вы хотели создать его на системе, которая запускает скрипт (не указано в вашем первоначальном вопросе). причина все еще актуальна, но решение нет.
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 hammer
y 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"
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.
awk
tiene potentes funciones de clasificación nativas incorporadas, por lo que no es necesario conectarse a un programa externo.
awk
Las funciones asort
y asorti
tambié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
.
El programa está repleto de declaraciones delete
para tener en cuenta el uso de la memoria, lo que podría convertirse en un problema a medida que crecen los conjuntos de datos.
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]
}'