Qual é o significado do '|' símbolo no shell?

16

O que significa o símbolo | no comando sudo ps -ef | grep processname ?

Alguém também pode explicar este comando? Eu usei este comando apenas para obter o PID e matar esse processo, mas também vi sudo ps -ef | grep processname | grep -v grep e tenho a impressão de que -v grep é como matar o PID gerado anteriormente por grep . Se é assim, como funciona?

    
por Aamir 01.12.2015 / 13:11

4 respostas

13
ps -ef | grep processname

Primeiro, executa sudo ps -ef e passa a saída para o segundo comando.

O segundo comando filtra todas as linhas que contêm a palavra "processname".

ps -ef | grep processname | grep -v grep lista todas as linhas que contêm processname e não contêm grep .

De acordo com man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

De acordo com man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

Você pode combinar os parâmetros -ef significa o mesmo que -e -f .

Na verdade, ps -ef | grep processname lista todas as ocorrências do processo chamado processname .

    
por Pilot6 01.12.2015 / 13:17
35

É chamado de pipe . Ele fornece a saída do primeiro comando como a entrada para o segundo comando.

No seu caso, significa:
O resultado de sudo ps -ef é alimentado como entrada de grep processname

sudo ps -ef :
Isso lista todos os processos em execução. Digite man ps no termial para mais.

grep processname
Então, essa lista de processos é alimentada no grep que apenas procura pelo programa definido por programname .

Exemplo

Digitar sudo ps -ef | grep firefox no meu terminal retorna:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox
    
por Parto 01.12.2015 / 13:14
7
Vou tentar responder com uma resposta prática direta:

O pipe | permite fazer coisas incríveis no shell! É o único operador que considero o mais útil e poderoso.

que tal contar arquivos em um diretório? simples:

ls | wc -l ..redireciona a saída de ls para wc com o parâmetro -l para linhas

ou contagem de linhas em um arquivo?

cat someFile | wc -l

e se eu quiser procurar por algo? 'grep' pode procurar por ocorrências de strings:

cat someFile | grep aRandomStringYouWantToSearchFor

você apenas redireciona a saída do comando à esquerda do Pipe para o comando à direita do pipe.

mais um nível: com que frequência algo ocorre em um arquivo?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

você pode usar o | para quase tudo:)

fortune | cowsay

    
por Gewure 01.12.2015 / 16:57
4
  

Eu usei este comando apenas para obter o PID e matar esse processo

Outras respostas já responderam à sua pergunta principal, mas eu gostaria de abordar isso também;

Em geral, matar um processo é muitas vezes um exagero e deixa os recursos alocados por um processo em um estado confuso, você pode frequentemente terminar ;

Além disso, use apenas pkill para matar / terminar um processo. pkill suporta a especificação de um nome de processo exato ou uma expressão regular:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo
    
por kos 01.12.2015 / 13:40