Obtém Substring designada a uma variável

3
bash-4.1$ ps -ef|grep component_events.xml
gdxx1122  1190  1181  0 Mar25 ?        00:00:00 /xx1122/fmw/product/111/ohs_111/ohs/bin/odl_rotatelogs -l -h:/xx1122/admin/xx1122_vmabcd123/config/OHS/ohs1/component_events.xml_ohs1 
/xx1122/admin/xx1122_vmabcd123/auditlogs/OHS/ohs1/audit-pid1181-%Y%m%d%H%M%S.log 1M 4M
gdxx1122 19885 19205  0 08:05 pts/1    00:00:00 grep component_events.xml

Quando executo o comando acima em um script, posso extrair "/ xx1122 / admin / xx1122_vmabcd123 / config / OHS / ohs1" e atribuir a uma variável. A saída acima pode variar de servidor para servidor, por isso tem que ser dinâmico. A sequência inicial xx1122 deve ser transmitida dinamicamente

    
por Gayathri Gowda 15.06.2018 / 09:25

2 respostas

3

Com sed , POSIXly:

var=$(
  ps -Ao args= | sed -n 's|.* -h:\(.*\)/component_events\.xml.*||p'
)

Na verdade, isso retorna a parte da linha de comando entre a última ocorrência de /component_events.xml e a última ocorrência antes de -h: .

Então, se a linha de comando for:

... -h:x/component_events.xml -g:y/component_events.xml

Você obteria x/components_events.xml -g:y em vez de x .

Você pode alterá-lo para sed -n 's|.* -h:\([^ ]*\)/component_events\.xml.*||p' para evitar isso, mas isso não será mais para nomes de diretório que contenham caracteres de espaço.

Em um sistema GNU / Linux recente, você também pode fazer:

LC_ALL=C grep -zhPo '^-h:\K.*(?=/component_events\.xml)' /proc/*/cmdline |
  tr '
var=$(
  ps -Ao args= | sed -n 's|.* -h:\(.*\)/component_events\.xml.*||p'
)
' '\n'

O que funcionaria para qualquer nome de diretório.

    
por 15.06.2018 / 09:42
0

Usando pgrep para encontrar o pid e /proc/$PID/cmdline :

var=$(
pgrep -f "component_events.xml" | \
    xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline | tr '
pgrep -f "component_events.xml"
' '\n'" | \ xargs -n1 dirname )

Isso também funciona quando o caminho do comando possui argumentos e quando vários PIDs foram encontrados.

Explicação :

Pesquisar por PIDs:

xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline

Para cada PID encontrado, obtenha o comando completo ( /proc/PID/cmdline ), mas imprima apenas o comando sem args ( head -z -n1 ).

tr '
xargs -n1 dirname
' '\n'"

Em seguida, substitua% trailing \n por nova linha ( %code% ):

var=$(
pgrep -f "component_events.xml" | \
    xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline | tr '
pgrep -f "component_events.xml"
' '\n'" | \ xargs -n1 dirname )

Gera o nome do dirname apenas:

xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline
    
por 15.06.2018 / 10:16

Tags