В общем случае, невозможно перечислить все функции без выполнения скрипта, потому что функция может быть объявлена чем-то вроде eval $(/some/program)
. Но если функции объявлены "нормально", вы можете искать вещи, которые выглядят как определения функций.
grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript
В сценариях оболочки нет возможности вводить функции или документировать их, поэтому любая документация должна быть представлена в комментариях. Вот грубый фрагмент Perl, который извлекает определения функций в общепринятом формате, а также непосредственно предшествующие или последующие комментарии.
perl -0777 -ne '
while (/^((?:[ \t]*\#.*\n)*) # preceding comments
[ \t]*(?:(\w+)[ \t]*\(\)| # foo ()
function[ \t]+(\w+).*) # function foo
((?:\n[ \t]+\#.*)*) # following comments
/mgx) {
$name = "$2$3";
$comments = "$1$4";
$comments =~ s/^[ \t]*#+/#/mg;
chomp($comments);
print "$name\n$comments\n";
}' myscript
Более точный способ вывести имена функций, если вы можете запустить скрипт, не вызывая побочных эффектов, или если вы можете выделить все определения функций в подскрипте, - это запустить скрипт, а затем заставить bash вывести все определения функций. В отличие от вышеописанного метода поиска по тексту, это включает определения функций в странном формате и исключает ложные срабатывания (например, в документах here), но это не может найти комментарии.
bash -c '. myscript; typeset -f'
попробуй
awk '{c[$1]++ ; t[$1]+=$4 }
END { for (cc in c ) if ( c[cc]>1 ) printf "%s : %.1f\n",cc,t[cc]/c[cc];}' file.log
которые дают
30903 : 49.5
, чтобы получить вывод, удалите часть if (c[cc]>1)
.
сценарий в основном подсчитывает c[$1]++
и добавляет значение t[$1]+=$4
.
c[x]
для счета (x ), то есть$1
:первое поле t[x]
для всего (x ), то есть суммы общего значения для 4-го поля в конце мы перебираем все значения, вычисляя и выводя среднее значение.
С Миллером(http://johnkerl.org/miller/doc)можно бегать
mlr --nidx stats1 -a mean -f 4 -g 1 inputFile
и есть
30901 89.000000
30902 51.000000
30903 49.500000
30904 59.000000
-f 4
для установки значения -имени поля, по которому вычисляется статистика (четвертого поля ); -g 1
для установки группы -по -именам полей (первое поле ).