целочисленное выражение ожидаемая ошибка при попытке выполнить команду в каждой строке

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"

заранее спасибо

Кев
источник

Ответы:

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
John1024
источник
Так как он хочет всю строку:awk 'NF>2 && $NF' file
Гленн Джекман
@glennjackman Спасибо! Я следовал примеру кода ( echo $last_col), но вы правы: в тексте указана полная строка. Ответ обновлен.
John1024,