入力の最初のN行を削除するコマンド


11

バックグラウンド

SSHサーバーを実行しており、このユーザーを削除する必要があります。このユーザーは、最初に強制終了する必要のあるいくつかのプロセスを現在実行しているため、削除できません。

これは、現在使用しているユーザーのすべてのプロセスIDを見つけるために現在使用しているパイプラインです。

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

出力は次のようになります。

PID
2121
2122
2124
2125
2369
2370

これをパイプkill -9してすべてのプロセスを強制終了し、次のようにこの愚かなユーザーを削除できます。

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

しかし、これはPIDヘッダーのために機能しません:

kill: failed to parse argument: 'PID'

質問

入力の最初の行を削除するには、単純なUnixコマンドが必要だと考えています。

tailこれに使用できることは承知していますが、表示する行数を正確に把握するために、入力に含まれる行数をカウントしたくありません。

headまたはtail逆のようなものを探しています(ストリームの最初/最後の部分のみを表示する代わりに、ストリームの開始/終了以外すべてを表示します)。

注意

コマンドの| grep [[:digit:]]後に追加するだけでこの問題を解決できましたawkが、他のシナリオでは非常に役立つと思うので、ファイルの最初の行を削除する方法を探しています。


すでにawkを使用しているので、NR例えばを使用してヘッダーレコード(行)を除外できますawk 'NR>1 {print $1;}'。いっそ-使用pgrep -upkill -u
steeldriver

@steeldriver面白い!答えを出して、それ(awkコマンド)がどのように機能するかを説明します。
wefwefa3

回答:


14

注:システムに既にpgrep/があるpkill場合は、ここで車輪を再発明します。システムにこれらのユーティリティがない場合は、出力をフォーマットpsして、邪魔にならないPIDリストを直接取得できます。ps -u user -opid=

を既に使用している場合awk、最初の行(レコード)を削除するために追加のプロセスをパイプ処理する必要はありません。単にレコード番号に条件を追加するだけですNR

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

あなたが言及しているためheadtail、この場合、あなたはおそらくしたい式がありますtail -n +2


4
tail -n +2まさに私が探していたものでした!
wefwefa3

+1を使用してpsヘッダーを-opid=出力しないように指示すると、出力が表示されなくなります。将来のユーザーpsがパイプラインの途中で出力をソートすることに決めた場合、awk / sed / tailの仮定が崩れる可能性があります。
ジェフシャラー

8

この質問を書いていたとき、私はを使って解決策を見つけましたsed

入力の先頭で1行削除します

1行を削除するには、を使用しますsed 1d

入力の先頭で複数の行を削除します

N行数を削除するにはsed 1,Nd

  • 最初の5行を削除するには sed 1,5d

  • 最初の10行を削除するには sed 1,10d

  • 最初の25行を削除するには sed 1,25d

パイプライン

そのため、パイプラインは次のようになります。

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.