尝试在每一行上运行命令时出现整数表达式预期错误

尝试在每一行上运行命令时出现整数表达式预期错误

我试图在文件的每一行上运行一个命令。下面是我目前所做的。我希望能够获取每一行,从中获取最后一列,对整数运行一个命令,如果它不等于零,则回显整行。我似乎遇到了错误,但似乎无法弄清楚在哪里。

#!/bin/bash

IFS=\n
file=`cat /proc/user_beancounters`

for line in "$file"
do
    last_col=`echo "$line" | awk '{print $(NF)}'`

    if [ $last_col -ne 0 ]; then
            echo $last_col
    fi

done

/proc/user_beancounters 的内容:

Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
34579:  kmemsize                 28694400             33435648             67108864             67108864                    0
        lockedpages                     0                    0                   64                   64                    0
        privvmpages                473539               581717               786432               786432                  176
        shmpages                    26821                26821                43008                43008                    0
        dummy                           0                    0  9223372036854775807  9223372036854775807                    0
        numproc                       113                  159                  500                  500                    0
        physpages                  199504               208572               524288               524288                    0
        vmguarpages                     0                    0                98304                98304                    0
        oomguarpages               188782               191010                 6144                 6144                    0
        numtcpsock                     35                   37                  160                  160                    0
        numflock                        8                   11                  100                  100                    0
        numpty                          1                    1                  200                  200                    0
        numsiginfo                      0                   36                  500                  500                    0
        tcpsndbuf                  616080               650960              8388608              8388608                    0
        tcprcvbuf                  577800               621600              8388608              8388608                    0
        othersockbuf               108664               135616              8388608              8388608                    0
        dgramrcvbuf                     0                16184              8388608              8388608                    0
        numothersock                  116                  128                  500                  500                    0
        dcachesize                8375457              8388258              8388608              8388608                    0
        numfile                      2627                 2915                 8192                 8192                    0
        dummy                           0                    0  9223372036854775807  9223372036854775807                    0
        dummy                           0                    0  9223372036854775807  9223372036854775807                    0
        dummy                           0                    0  9223372036854775807  9223372036854775807                    0
        numiptent                     168                  168              9999999              9999999                    0

在上面的例子中,我希望脚本基本上找出“privvmpages”失败了不止一次的情况,因此回显该行:

privvmpages                473539               581717               786432               786432                  176

或者如果可能的话,只需名称“privvmpages”和数字“176”

提前致谢

答案1

使用bash

以下工作:

while IFS= read -r line
do
    last_col=`echo "$line" | awk '{print $(NF)}'`
    if [[ $last_col =~ ^[[:digit:]]+$ && "$last_col" -ne 0 ]]; then
            echo $line
    fi    
done </proc/user_beancounters

笔记:

  • 该命令IFS=\n设置IFS为字母n。这不是您想要的。如果您确实想要IFS换行符,请改用IFS=$'\n'

  • $last_col =~ ^[[:digit:]]+$

    此测试确保为last_col整数。这具有跳过标题行的效果。

使用awk

循环遍历文件的行是awk很自然的事情。上面的代码可以替换为:

 awk 'NR > 2 && $NF != 0' /proc/user_beancounters

笔记:

  • NR>2

    文件的前两行是标题。这将跳过它们。

  • $NF != 0

    这将选择最后一个字段非零的行。

  • 如果以上两个条件没有明确的命令,awk则将打印整行。

或者,如果您只想打印第一列和最后一列,请使用:

awk 'NR>2 && $NF != 0 {print $1,$NF}' /proc/user_beancounters

相关内容