цілеспрямований вираз очікуваної помилки при спробі запуску команди на кожному рядку


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

Оскільки він хоче весь рядок: awk 'NF>2 && $NF' file
glenn jackman

@glennjackman Спасибі! Я слідував за зразком коду ( echo $last_col ), але ви праві: текст задає повний рядок. Відповідь оновлено.
John1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.