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

16

O que o |símbolo significa em sudo ps -ef | grep processnamecomando?

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

Aamir
fonte
4
Você não precisa sudocorrer ps -ef. Também um truque comum para evitar o terceiro comando é colocar um caractere do nome do processo entre colchetes:ps -ef | grep [p]rocessname
kos
11
@kos Esse comando precisa citações ao trabalho de forma confiável:ps -ef | grep '[p]rocessname'
kasperd
2
@kos Se você escreve grep [p]rocessname, está dizendo ao shell para procurar um arquivo no diretório atual com o nome processnamee substituir o padrão pelo nome do arquivo. Se nenhum arquivo nomeado processnameexistir, o shell poderá passar o padrão literalmente para grep. Mas isso depende das suas configurações. Então a sua versão vai quebrar se um arquivo nomeado processnameexiste ou se qualquer uma das seguintes opções do shell tiver sido habilitado failglob, nullglob, nocaseglob.
kasperd
11
@ Kasperd Eu interpretei mal o seu último comentário, sim, você está correto sobre tudo. Eu não considerei isso.
kos
11
Não acredito que isso não seja duplicado.
Mast

Respostas:

13
ps -ef | grep processname

Primeiro, ele executa sudo ps -efe 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 greplista todas as linhas que contêm processnamee 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 parâmetros -efsignifica o mesmo que -e -f.

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

Pilot6
fonte
obrigado pela explicação, o que ps -effaz exatamente?
Aamir
Eu acho que quando corremos | grep processNameem terminais também temos saída do grep que em si é um processo tão -v mata esta saída
Aamir
Você está certo.
precisa saber é o seguinte
35

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

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

sudo ps -ef:
Lista todos os processos em execução. Digite man pso termo para obter mais.

grep processname
Portanto, essa lista de processos é inserida no grep, que apenas procura o programa definido por programname.

Exemplo

Digitando sudo ps -ef | grep firefoxmeu 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
Parto
fonte
ok, o que -v grep, o que faz.
Aamir
boa explicação, mas eu preciso de alguma ajuda sobre como -v grep funciona ..
Aamir
Oh, eu vejo porque grep -vé usado. Para filtrar a última linha.
Pilot6
@Aamir Veja minha resposta. grep -vfiltra as linhas OUT contendo padrão.
precisa saber é o seguinte
11
Você também pode adicionar que você pode usar vários tubos. Por exemplo, eco "foobar" | grep foo | grep bar
Michael
7

Vou tentar responder com uma resposta prática direta:

O cano |permite que você faça 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..redirecionar a saída de lspara wcwit parâmetro -lpara linhas

ou contagem de linhas em um arquivo?

cat someFile | wc -l

e se eu quiser procurar 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

insira a descrição da imagem aqui

Gewure
fonte
2
Sim, os tubos são divertidos, +1, mas altere os exemplos: UUOC .
kos
Como: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi
claro. mas com o propósito de simplicidade ... o questionowner não parece ser mais profunda no grep, por exemplo :)
Gewure
11
Francamente, muitos de seus exemplos não precisam de canos. Você já ouviu falar em desmoggificação? Você está usando o cat and pipe quando muitos dos comandos pegam os arquivos como parâmetros diretamente: por exemplo, cat someFile | grep aRandomStringYouWantToSearchFor deve ser grep aRandomStringYouWantToSearchFor someFile
Captain Lepton
gente .. eu sei. se você ler os comentários, capitão, você terá lido minha resposta. O cara que fez as perguntas não entenderá as aplicações REAIS do pipe - ele nem sabe o que é grep. então devo dar-lhe este exemplo? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') não, porque não serviria ao propósito.
Gewure
4

Eu usei esse 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 geralmente é um exagero e deixa os recursos alocados por um processo em um estado confuso; geralmente, você pode finalizá- lo;

Além disso, basta usar pkillpara matar / encerrar um processo. pkillsuporta a especificação de um nome exato do processo ou de 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
kos
fonte
11
Não use a kill -9menos que saiba especificamente que nenhum outro sinal funcionará. Veja também iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP afirmou que eles querem matar o processo embora.
kos
Isso é o que killfaz. A especificação -9é uma opção extra adicional e mais frequentemente desastrosa.
Tripleee
Tripleee @ Eu acredito que a confusão está surgindo por causa da terminologia; para mim matar = SIGKILL, não SIGTERM.
kos
Para a maioria das pessoas, eu esperaria que "matar" significasse kill, pura e simplesmente. Qualquer terminologia à parte, sua resposta não deve aconselhar as pessoas a usar a -9opção, a menos que você faça uma ressalva.
Tripleee