Comando para remover o primeiro número N de linhas na entrada


11

fundo

Estou executando um servidor SSH e tenho esse usuário que desejo excluir. Não consigo excluir este usuário porque ele está atualmente executando alguns processos que eu preciso eliminar primeiro.

Este é o pipeline que estou usando atualmente para descobrir todos os IDs de processo do usuário que estou usando:

ps -u user | awk '{print $1;}'

A saída é assim:

PID
2121
2122
2124
2125
2369
2370

Quero canalizar isso para kill -9matar todos os processos, para que eu possa excluir esse usuário estúpido como este:

ps -u user | awk '{print $1;}' | sudo xargs kill -9

Mas isso não funciona por causa do PIDcabeçalho:

kill: failed to parse argument: 'PID'

A questão

Estou pensando que deve haver um simples comando Unix para remover a primeira linha de entrada.

Estou ciente de que posso usar tailisso, mas não quero contar quantas linhas a entrada contém para descobrir exatamente quantas eu quero exibir.

Estou procurando algo parecido headou tailinvertido (em vez de exibir apenas a primeira / última parte do fluxo, ele exibe tudo, exceto o início / fim do fluxo).

Nota

Consegui resolver esse problema que simplesmente adicionei | grep [[:digit:]]após o meu awkcomando, mas ainda estou procurando uma maneira de excluir a primeira linha de um arquivo, pois acho que seria bastante útil em outros cenários.


Como você já está usando o awk, você pode ter excluído o registro do cabeçalho (linha) usando, NRpor exemplo awk 'NR>1 {print $1;}'. Melhor ainda - use pgrep -uorpkill -u
steeldriver

@steeldriver Interessante! Faça uma resposta e explique como (o awkcomando) funciona.
wefwefa3

Respostas:


14

NOTA: se seu sistema já possui pgrep/ pkill, você está reinventando a roda aqui. Se o seu sistema não tiver esses utilitários, você poderá formatar a saída pspara obter a lista PID não onerada diretamente, por exemplops -u user -opid=

Se você já estiver usando awk, não há necessidade de passar por um processo adicional para remover a primeira linha (registro): basta adicionar uma condição ao número do registroNR

ps -u user | awk 'NR>1{print $1;}'

Desde que você mencionou heade tail, a fórmula que você provavelmente deseja neste caso étail -n +2


4
tail -n +2era exatamente o que eu estava procurando!
wefwefa3

+1 por dizer para psnão imprimir um cabeçalho -opid=, pois isso impede que a saída apareça. Se um usuário futuro decidir classificar a pssaída no meio do pipeline, a suposição awk / sed / tail poderá quebrar.
Jeff Schaller

8

Enquanto escrevia essa pergunta, descobri uma solução usando sed.

Excluir uma linha no início da entrada

Para excluir uma linha, use sed 1d.

Excluir várias linhas no início da entrada

Para excluir o Nnúmero de linhas, usesed 1,Nd

  • Para excluir as 5 primeiras linhas, use sed 1,5d

  • Para excluir as 10 primeiras linhas, use sed 1,10d

  • Para excluir as primeiras 25 linhas, use sed 1,25d

O gasoduto

Portanto, o pipeline torna-se no cenário:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.