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


0

我试图从本质上在文件的每一行上运行命令。以下是到目前为止的内容。我希望能够获取每一行,从中获取最后一列,对整数运行命令,如果它不等于零,则回显整行。我似乎遇到了错误,似乎无法找出错误所在。

#!/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”

提前致谢

Answers:


3

使用 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

由于他想要整个电话:awk 'NF>2 && $NF' file
glenn jackman

@glennjackman谢谢!我遵循的是示例代码(echo $last_col),但您是对的:文本指定了整行。答案已更新。
John1024
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.