저는 아래 코드를 개발했으며 향후 요구 사항에 맞게 이 코드를 개선하고 싶습니다. 그래서 함수를 사용하면 코드가 지금보다 훨씬 좋아지고 매우 체계적으로 보일 것이라고 생각했습니다.
그렇다면 절차나 조직화된 코드 블록으로 어떻게 이동합니까?
저 좀 도와 주 시겠어요?
버전:Red Hat Enterprise 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
아래와 같은 프로그램으로 하면 될 것 같아요 . 언뜻 보면 실제보다 길어 보이는데, 설명적인 긴 변수 이름을 사용하고, 양심적으로 가능하면 즉시 메모리를 해제하기 때문이다.
awk
강력한 기본 정렬 기능이 내장되어 있으므로 외부 프로그램으로 파이프할 필요가 없습니다.awk
asort
함수는asorti
또한 선택적 세 번째 인수를 취합니다.정렬 방법@ind_num_asc
,@ind_num_desc
,@ind_num_asc
, 등이 될 수 있으며@ind_num_desc
오름차순 또는 내림차순으로 정렬하는 다양한 방법으로 사용됩니다. 늘 그렇듯이man
페이지를 확인해 보세요.delete
메모리 사용량을 설명하기 위해 프로그램은 명령문으로 채워지는데, 이는 데이터 세트가 커짐에 따라 문제가 될 수 있습니다.사용할 샘플 입력 데이터를 제공하지 않은 것은 유감입니다. 코딩하면서 즐거운 시간을 보냈지만 입력 데이터 없이 작동하는 것이 얼마나 가까운지는 신만이 알고 있으므로 작동하려면 약간의 작업이 필요할 수 있는 개념 증명으로 아래 코드를 고려하십시오. 기본 요점은 가장 효율적인 방법은 아마도
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] }'