BEGIN
e END
não recebem valores de campo.
$ awk 'BEGIN { print $0 / 1024 / 1024 ; exit }' <<< '3300000'
0
$ awk '{ print $0 / 1024 / 1024 ; exit }' <<< '3300000'
3.14713
Eu tenho o script de shell abaixo que tenta calcular a freqüência da CPU em GHz. O script é basicamente enxuto em shellcheck cpu_freq.sh
. O problema é que não imprime a frequência da cpu; imprime 0:
$ ./cpu_freq.sh
CPU_FREQ: 0
Abaixo, estou usando echo
, mas eu tentei outras coisas também como redirecionar a chave do sistema de arquivos para o comando, usando um arquivo aqui e vários outros do estouro de pilha.
O script imprime 0
em vez do valor 3.147
. Por que o script não está imprimindo 3.147
ou algo assim?
Aqui está um rastreamento do script.
$ bash -x cpu_freq.sh
+ GREP=grep
+ AWK=awk
...
+ CPU_FREQ=0.5
+ [[ -e /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq ]]
++ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
+ CPU_FREQ=3300000
++ echo 3300000
++ awk 'BEGIN {print $0/1024/1024; exit}'
+ CPU_FREQ=0
+ echo 'CPU_FREQ: 0'
CPU_FREQ: 0
Aqui está o script.
$ cat -n cpu_freq.sh
1 #!/usr/bin/env bash
2
3 GREP=grep
4 AWK=awk
5
6 THIS_SYSTEM=$(uname -s 2>&1)
7 IS_AIX=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c aix)
8 IS_DARWIN=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c darwin)
9 IS_SOLARIS=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c sunos)
10
11 # Benchmarks expect frequency in GiHz.
12 CPU_FREQ=0.5
13 if [[ (-e "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq") ]]; then
14 CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)"
15 CPU_FREQ="$(echo "$CPU_FREQ" | $AWK 'BEGIN {print $0/1024/1024; exit}')"
16 elif [[ (-e "/proc/cpuinfo") ]]; then
17 CPU_FREQ="$($GREP 'MHz' < /proc/cpuinfo | $AWK '{print $4; exit}')"
18 if [[ -z "$CPU_FREQ" ]]; then CPU_FREQ=512; fi
19 CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
20 elif [[ "$IS_DARWIN" -ne "0" ]]; then
21 CPU_FREQ="$(sysctl -a 2>&1 | $GREP "hw.cpufrequency" | $AWK '{print ($3); exit;}')"
22 CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024/1024/1024}')"
23 elif [[ "$IS_SOLARIS" -ne "0" ]]; then
24 CPU_FREQ="$(psrinfo -v 2>/dev/null | $GREP "MHz" | $AWK '{print $6; exit;}')"
25 CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
26 elif [[ "$IS_AIX" -ne "0" ]]; then
27 CPU_FREQ="$(prtconf -s 2>/dev/null | $GREP "MHz" | $AWK '{print $4; exit;}')"
28 CPU_FREQ="$(echo $CPU_FREQ | $AWK 'BEGIN {print $0/1024}')"
29 fi
30
31 echo "CPU_FREQ: $CPU_FREQ"
Aqui está o aviso shellcheck
restante. Eu acredito que este é esperado.
In cpu_freq.sh line 15:
CPU_FREQ="$(echo "$CPU_FREQ" | $AWK 'BEGIN {print $0/1024/1024; exit}')"
^-- SC2016: Expressions don't expand in single quotes, use double quotes for that.
Tags text-processing awk linux