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

10

Antecedentes

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

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

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

A saída é assim:

PID
2121
2122
2124
2125
2369
2370

Eu quero canalizar isso para kill -9 para matar todos os processos para que eu possa excluir esse usuário estúpido assim:

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

Mas isso não funciona devido ao cabeçalho PID :

kill: failed to parse argument: 'PID'

A questão

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

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

Estou procurando por algo como head ou tail , mas invertido (em vez de exibir apenas somente a primeira / última parte do fluxo, exibe tudo, mas início / fim do fluxo).

Nota

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

    
por wefwefa3 31.12.2015 / 15:25

2 respostas

14

NOTA: se o seu sistema já tiver pgrep / pkill , então você está reinventando a roda aqui. Se o seu sistema não tiver esses utilitários, você deverá ser capaz de formatar a saída de ps para obter diretamente a lista PID desonerada, por exemplo, ps -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 no número de registro NR

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

Como você mencionou head e tail , a fórmula que você provavelmente deseja, neste caso, é tail -n +2

    
por 31.12.2015 / 15:40
7

Enquanto escrevia esta 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 N número de linhas, use sed 1,Nd

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

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

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

O pipeline

Assim, o pipeline se torna no cenário se torna:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
    
por 31.12.2015 / 15:26