Estou tentando fazer um script de shell de uso de disco simples (em traço), mas não tenho certeza de como analisar essa string porque não estou familiarizado com a sintaxe do AWK.
Eu uso este comando: df -P -BG /
e, por exemplo, ele me dá uma saída como esta:
Filesystem xxxxxxxxxx-blocks Used Available Capacity Mounted on
/dev/mapper/xxx_crypt 500G 200G 100G xx% /
Quero extrair a coluna abaixo em "Usado" (e eventualmente "Disponível"), mas não tenho certeza de como devo fazer isso. Eu sei que o AWK tem um comando de pesquisa como este:awk '/Used/ {print}'
Mas não tenho certeza de como colocar a linha abaixo dela. Alguma dica? É muito importante para mim que ele funcione como um canal em uma linha, já que df -P -BG / | awk '...'
estou armazenando-o em uma variável shell, mas não é estritamente necessário, suponho, já que o AWK multilinha pode ser usado.
Se sua
df
implementação suportar, você poderá usar--output
em vez de analisar. Noman df
meu Arch Linux:Então, no seu caso, você simplesmente faria:
Se você realmente precisa analisá-lo, eu não me preocuparia com a correspondência de padrões. Você controla a entrada, ela não muda, então basta imprimir o terceiro campo (saída do meu sistema):
Se você realmente precisa que funcione mesmo que a ordem dos campos mude, então você precisa descobrir qual campo contém a string
Used
, você pode fazer algo complicado como isto:Usando GNU awk para FPAT, FIELDWIDTHS, \s, \S e gensub():
Substitua
cat file
pelodf -P -BG /
que não tenho. Estou apenas tentandocolumn
alinhar as colunas, não é necessário.Com essa abordagem, você pode imprimir, comparar, reordenar, fazer aritmética, etc., os valores de quaisquer colunas que desejar pelo nome. O único que tive que massagear no código foi "Montado em" para alterar o espaço para um sublinhado.
Aqui está uma versão que funcionará em qualquer awk:
Usando Raku (anteriormente conhecido como Perl_6)
Acima está uma resposta escrita em Raku, um membro da família de linguagens de programação Perl. Resumidamente, um
$
escalar -sigiled é declarado e atribuído à string "Usado". Em seguida,lines
são lidos, cada ummap
ped dentro esplit
em\h
espaços em branco horizontais. Normalmente, esse retorno seria realizado em uma estrutura de dados leve conhecida como noSeq
Raku, mas aqui forçamosList
e salvamos os dados no@table
array.Agora, para a coluna correta. Pegamos
@table.head
o que nos dá a linha do cabeçalho original (ou seja, linha) da tabela. Analisamosgrep
esses elementos para encontrar uma correspondência$target
e pegamos as:k
chaves, ou seja, número (s) de índice da coluna, armazenando-os em$col
. Por fim, retiramosput
os@a.table
dados, retornando apenas as$col
colunas desejadas.Entrada de amostra:
Saída de amostra:
O OP expressou o desejo de ter um script que aceite variáveis de shell. Raku possui um array associativo especial
%*ENV
que pode ser usado para acessar variáveis do shell. Então abaixo pega a variável shellcolName
do ambiente (ou seja, o shell):Da mesma forma, você pode retornar duas colunas, etc., com apenas um pequeno ajuste, conforme abaixo:
https://docs.raku.org/routine/grep
https://raku.org