Aqui está outro usando a formatação de saída de ps
:
#!/usr/bin/sh -f
printf '%-8.7s%-8s%s\n' $(
ps -o uname=UID,pid=PID,args=APPNAME |
sed -n '1p;s/\( [0-9]* \).*\(-Dapp.name=[^ ]*\).*//p'
)
Com base em sua string de formato, para cada 3 de seus argumentos printf
será impresso:
- O primeiro espaço é preenchido à direita para uma largura de tabulação padrão de 8 caracteres e truncado para um máximo de 7 caracteres.
- O segundo espaço é preenchido à direita para uma largura de tabulação padrão de 8 caracteres.
- E depois o terceiro seguido por um
\n
ewline.
A substituição do comando não é citada de propósito . Observe o -f
que segue sh
na linha bang - especifica que o shell não deve glob -, portanto, não há perigo de gerar aleatoriamente nomes de arquivo baseados em caracteres especiais do shell. A substituição do comando será dividida em $IFS
defaults - space, tab, newline.
Na substituição do comando, ps
imprime três colunas - com UID , PID e APPNAME . ps
é não especificado pelo POSIX para imprimir qualquer espaço em qualquer campo exceto o campo args=
. Portanto, as duas primeiras colunas são $IFS
safe. Ainda assim, para obter a string -Dapp.name
do campo args=
, ela deve ser processada.
Então sed
filtra. Em linhas contendo pelo menos dois espaços e a string -Dapp.name = é impressa:
- A primeira sequência de um espaço, então zero ou mais números, depois um espaço e tudo o que o precede ...
- A última sequência que ocorre contendo a string -Dapp.name = seguida por todos os caracteres antes do próximo espaço.
As substituições de
sed
não afetam os títulos das colunas - impressas com 1p
- porque não contêm a string -Dapp.name = . Todas as outras linhas são excluídas da saída.
Depois de aplicar a saída de printf
a sed
em $IFS
, você pode esperar uma saída como a seguinte:
UID PID APPNAME
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
sas 24431 -Dapp.name=myApp
Na minha opinião, porém, essa declaração sed
funcionaria um pouco melhor:
sed -n '1p;s/\( [0-9]* \).*-Dapp.name=\([^ ]*\).*//p'
É basicamente o mesmo, exceto que retira a parte -Dapp.name = de
para que seja impressa como ...
UID PID APPNAME
sas 24431 myApp
sas 24431 myApp
sas 24431 myApp
Porque, como é apenas a impressão de linhas que contêm a sequência -Dapp.name = , inclusive é uma espécie de confusão que pode ser considerada como certa.