comando | grep | awk | … Como executar

2

então eu tenho esse comando %código% que produz algo como

cat /proc/9989/status | grep State 
cat /proc/9992/status | grep State 
cat /proc/9993/status | grep State 
cat /proc/9994/status | grep State 

Mas eu adoraria dar um passo à frente e executar essas linhas. Então, eu estou faltando alguma coisa após o comando awk para executar a saída. algo como ps ax | grep apache | awk '{ print "cat /proc/"$1"/status | grep State" }' ou similar.

Isso é possível?

    
por Illiax 02.10.2017 / 22:18

4 respostas

2

Além de canalizar os comandos para um shell como o icarus disse corretamente, awk pode executar um comando shell em si:

  ps ax | grep apache | awk '{ system("cat /proc/"$1"/status | grep State") }' 

Mas você não precisa de cat porque grep pode ler um arquivo como RomanPerekhrest mostrou silenciosamente:

  ps ax | grep apache | awk '{ system("grep State /proc/"$1"/status") }' 

E você não precisa do segundo grep porque awk pode ler um arquivo e corresponder a um regexp:

 ps ax | grep apache | awk '{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # if maxfiles is enough you don't need the close(F)

nem o primeiro:

 ps ax | awk '/apache/{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # ditto

Mas você não precisa realmente olhar para /proc porque ps já mostra o estado, embora abreviado:

 ps ax | awk '/apache/{print $3}'
 # or print $1,$3 to include PID like Kusalananda's ps-based answer
 # or better check $5~/apache/ to avoid including processes that 
 # aren't _running_ apache but have apache in their _arguments_ 
    
por 03.10.2017 / 08:27
4

pgrep + abordagem xargs :

pgrep apache | xargs -I {} grep State "/proc/{}/status"

O resultado exemplificativo seria semelhante:

State:  S (sleeping)
State:  S (sleeping)
    
por 02.10.2017 / 22:32
4

Se você está apenas após o estado atual das instâncias apache em execução, então você está pulando por vários obstáculos.

Você pode usar

$ pgrep apache | xargs -n 1 ps -o pid=,state= -p
12206 S
12821 S
12872 S
12873 S
13084 S

Isso usará pgrep para obter todos os PIDs para todos os processos apache em execução e os concederá a xargs . xargs executará ps para consultar o estado dos PIDs fornecidos e retornará uma lista de PIDs e seu estado atual.

O = no final de pid= e state= impedirá que um cabeçalho seja impresso para essa coluna.

Para obter uma lista do significado dos estados de uma única letra, verifique o manual ps em seu sistema.

O comando acima também é portátil para Unices sem o sistema de arquivos /proc do Linux, embora as informações de estado possam ser apresentadas de uma forma diferente. Isso está no OpenBSD com apache substituído por ksh para testes:

$ pgrep ksh | xargs -n 1 ps -opid=,state= -p
22007 INsp
94426 IN+p
46726 INsp
70684 INsp
 5224 INsp
 9116 SNsp
    
por 02.10.2017 / 22:38
3

O comando que você quer no lugar de "exec" é "sh". Seu programa awk está produzindo um script de shell, então apenas o alimente com o shell!

Outras respostas sugerindo que você está fazendo muito estão corretas, por exemplo, você não precisa tanto do grep quanto do awk, pois o awk pode filtrar sua entrada.

    
por 03.10.2017 / 03:31