使用 Bash 脚本创建函数

使用 Bash 脚本创建函数

我在下面开发了代码,我想改进此代码以满足未来的需要。所以我想如果我使用函数,代码可能会比现在好得多,而且看起来会很有组织。

那么我如何转向程序或有组织的代码块呢?

请你帮助我好吗?

版本:红帽企业 Linux 服务器版本 7.3 (Maipo)

(输出必须相同)

 #!/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

输出;

  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 

答案1

如果您愿意,您绝对可以将其放入函数中。这是一个示例,我也尝试减少您正在进行的处理。由于我不知道输出是什么hammer host list样的,所以我根据您的原始代码做了猜测。

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

该函数将所有内容写入标准输出,并且在调用该函数时重定向该输出。它使用临时文件来存储hammer输出,并在完成后删除该输出。


如果你想进一步分解它:

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"

答案2

我想我可以在一个awk程序中完成它,如下所示。乍一看,它似乎比实际长度要长,因为它使用长描述性变量名称,并且在可能的情况下认真地立即释放内存。

  1. awk内置强大的本机排序函数,因此无需通过管道连接到外部程序。

  2. awkasort和函数asorti还带有可选的第三个参数,即排序方法,可以是@ind_num_asc@ind_num_desc@ind_num_asc@ind_num_desc等,用于按升序或降序排序的各种方式。像往常一样,查看man页面。

  3. delete为了考虑到内存使用情况,程序中充满了语句,随着数据集的增长,这可能会成为一个问题。

  4. 遗憾的是您没有给我们提供示例输入数据来使用。我在编码过程中度过了一段愉快的时光,但上帝只知道在没有输入数据的情况下工作有多接近,所以将下面的代码视为可能需要工作才能工作的概念验证。基本要点是,最有效的方法可能是单个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] }'

相关内容