我想弄清楚如何使用AWK来减去行。例如,假设输入文件是:
30
20
Run Code Online (Sandbox Code Playgroud)
输出将是:
10
Run Code Online (Sandbox Code Playgroud)
现在,作为测试,我试图从以下位置计算“已用”内存列:
$ cat /proc/meminfo
Run Code Online (Sandbox Code Playgroud)
所以目前我写了这个:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
-- Here comes the calculation using AWK
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}'
Run Code Online (Sandbox Code Playgroud)
但这只是给了我最后一行数据。
我找到了一个可行的解决方案,但我怀疑它是否是最佳解决方案。我所有的编码经验都告诉我,硬编码行数很糟糕:P
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'
Run Code Online (Sandbox Code Playgroud)
你也可以做到这一点使用awk,paste和bc。我发现这种方法更容易记住, 的语法awk总是要求我查资料以确认。
注意:这种方法的优点是能够处理多行输出,从第 1 个数字中减去第 2 个、第 3 个、第 4 个等数字。
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | paste -sd- - | bc
7513404
Run Code Online (Sandbox Code Playgroud)
以上用于awk选择包含我们要减去的数字的列。
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'
7969084
408432
Run Code Online (Sandbox Code Playgroud)
然后我们使用paste组合这两个值并在它们之间添加减号。
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'| paste -sd- -
7969084-346660
Run Code Online (Sandbox Code Playgroud)
当我们将bc它传递给它时,它会执行计算。
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'| paste -sd- - | bc
7513404
Run Code Online (Sandbox Code Playgroud)
纯粹的 awk 解决方案,没有多余的 cat 或 grep 命令:
awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo
我看到 awk_FTW 打败了我,但我认为格式化输出可能会很好。