如何使用 AWK 减去行(行)

Dyl*_*eus 10 linux awk

我想弄清楚如何使用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)

slm*_*slm 9

你也可以做到这一点使用awkpastebc。我发现这种方法更容易记住, 的语法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)


Joh*_*han 6

纯粹的 awk 解决方案,没有多余的 cat 或 grep 命令:

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

我看到 awk_FTW 打败了我,但我认为格式化输出可能会很好。