Simplificando o one-liner com sed e várias chamadas awk

4

Eu gostaria de simplificar este forro que será impresso somente se uma partição for maior ou igual a 60% de utilização. Também gostaria de acrescentar um sinal de porcentagem ao valor de utilização.

df -h | sed 's/%//g' | awk '{print $6,$5 }' | awk '{ if($2 >=60 ) print}' | column -t

Estou usando uma variante BSD e não tenho as ferramentas GNU comuns instaladas.

    
por Steve 29.12.2016 / 18:08

6 respostas

1

Como isso é marcado awk , vamos trabalhar nisso. O primeiro awk está apenas sendo usado para mover as colunas 6 e 5 para 1 e 2, para que possamos nos livrar disso e apenas usar 6 e 5 no segundo awk.

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 }' | column -t

Também podemos adicionar o sinal de porcentagem

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 "%"}' | column -t

Podemos remover o sed e fazer isso dentro do awk

df -h | awk '{gsub(/%/,""); if($5 >=60) print $6, $5 "%"}' | column -t

Poderíamos remover o column -t deixando o awk armazenar os valores em uma matriz e, em seguida, em um loop de instrução END sobre a matriz para descobrir o nome mais longo e imprimir adequadamente, mas isso não é mais um one liner na minha opinião.

    
por 29.12.2016 / 18:28
2

Um pouco mais fácil com o grep simples. Apenas as duas colunas não serão trocadas.

$ df -h|egrep -o "(100|[6-9].)% /.*$"
65% /
93% /home
    
por 29.12.2016 / 18:59
1

Você pode substituir o sed por tr -d "%" e combinar as duas invocações de awk em uma única:

$ df -h | tr -d "%" | awk '$5 >= 60 { print $6, $5 }' | column -t

Para obter o sinal de porcentagem:

$ df -h | tr -d "%" | awk '$5 >= 60 { printf("%s %s%s\n", $6, $5, (NR>1?"%":"")) }' | column -t

A segunda versão do script Awk adiciona condicionalmente um % à segunda coluna de saída, dependendo se NR for maior que um ou não. Se NR for um, não adicionamos % , pois essa é a linha de cabeçalho.

    
por 29.12.2016 / 18:25
1
O comando

GNU df possui --output switch, que permite exibir apenas colunas específicas. Sabendo disso e combinando com o conhecimento de que podemos substituir o texto em awk , o trabalho fica um pouco mais fácil:

$ df --output=source,pcent | awk '{gsub(/\%/," ");if($2 > 60) print}'                                                        
Filesystem     Use 
/dev/sda1       63 

O Python também pode fazer tudo isso. Como uma linha:

df --output=source,pcent | python -c "import sys;lines=sys.stdin.readlines();lines.pop(0);print [l.strip() for l in lines if int(l.replace('%',' ').split()[1]) > 60]"

Ou como script para mais legibilidade:

bash-4.3$ cat filter_df.py 
#!/usr/bin/env python
import sys;
for index,line in enumerate(sys.stdin):
    if index == 0: continue
    if int(line.replace('%',' ').split()[1]) > 60 :
        print line
bash-4.3$ df --output=source,pcent | ./filter_df.py 
/dev/sda1       63%
    
por 29.12.2016 / 21:15
0

Se pudermos usar o Perl:

df | perl -nE 'say "$2\t$1"   if /(\d+)% (.*)/ and $1>60'

ou

df | perl -nE '/(\d+)% (.*)/ and $1>60 and  say "$2\t$1"'
    
por 29.12.2016 / 19:53
0

Mostre as partições com mais de 60% de uso (tamanho ou inodes):

df -h | grep '[67890].%'

é simples assim. (0 está lá para pegar os com 100℅)

    
por 11.01.2017 / 09:21