web-dev-qa-db-ja.com

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

バックグラウンド

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を使用できることは承知していますが、表示する行数を正確に把握するために入力に含まれる行数を数えたくありません。

headtailのようなものを探していますが、反転表示されます(表示されるストリームの最初/最後の部分onlyの代わりにすべてのもの)ストリームの開始/終了)。

注意

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

11
wefwefa3

注:システムにpgrep/pkillがすでにある場合は、ここでホイールを再発明しています。システムにこれらのユーティリティがない場合は、次のことができるはずです。 psの出力をフォーマットして、妨害されていないPIDリストを直接取得します。例:ps -u user -opid=

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

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

headtailについて言及しているので、この場合におそらく必要な式はtail -n +2

14
steeldriver

この質問を書いているときに、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
8
wefwefa3