expressão inteira erro esperado ao tentar executar um comando em cada linha

0

Estou tentando essencialmente executar um comando em cada linha de um arquivo. Abaixo está o que eu tenho até agora. Eu quero ser capaz de tomar cada linha, tirar a última coluna dele, executar um comando no inteiro e, se não for igual a zero, ecoar a linha completa. Parece que estou encontrando erros e não consigo descobrir onde.

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

Conteúdo de / 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

No exemplo acima, quero que o script detecte que "privvmpages" falhou mais de uma vez e, portanto, faça eco da linha:

privvmpages                473539               581717               786432               786432                  176

Ou, se possível, apenas o nome "privvmpages" e o número "176"

Obrigado antecipadamente

    
por Kev 09.02.2015 / 22:49

1 resposta

3

Usando bash

Os seguintes trabalhos:

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

Notas:

  • O comando IFS=\n define IFS para a letra n . Isto não é o que você quer. Se você realmente quiser que IFS seja uma nova linha, use IFS=$'\n' .

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

    Este teste assegura que last_col seja um inteiro. Isso tem o efeito de pular as linhas de cabeçalho.

Usando awk

Repetir as linhas de um arquivo é algo que awk faz naturalmente. O código acima pode ser substituído por:

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

Notas:

  • NR>2

    As duas primeiras linhas do arquivo são cabeçalhos. Isso pula sobre eles.

  • $NF != 0

    Isto seleciona linhas cujo último campo é diferente de zero.

  • sem comando explícito associado às duas condições acima, awk imprimirá toda a linha.

Como alternativa, se você quiser imprimir apenas a primeira e a última coluna, use:

awk 'NR>2 && $NF != 0 {print $1,$NF}' /proc/user_beancounters
    
por 09.02.2015 / 23:01

Tags