web-dev-qa-db-ja.com

出力の最初の行をスキップする方法は?

これが問題です。hpcにあるジョブの数を数えたいのですが、これはすぐに提供される機能の1つではありません。だから私はこの簡単なスクリプトを作りました

squeue -u user_name | wc -l

ここで、squeueは次のようなすべてのジョブを出力します

> squeue -u user_name
   JOBID PARTITION NAME     USER ST       TIME  NODES NODELIST(REASON)
 8840441    theory cteq      fxm PD       0:00      1 (Resources)
 8840442    theory cteq      fxm PD       0:00      1 (Priority)
 8840443    theory cteq      fxm PD       0:00      1 (Priority)
 8840444    theory cteq      fxm PD       0:00      1 (Priority)

これはwcにパイプされ、行数がカウントされます。ただし、最初の行はジョブのエントリではありません。カウント時に最初の行をスキップするようにwcにどのように指示できますか?それとも、wcの出力から1を引いた方がいいでしょうか。

前もって感謝します!

10
zyy

これを行うには多くの方法がありますが、私が最初に考えたのは:

squeue -u user_name | tail -n +2 | wc -l

tailのmanページから:

-n, --lines=[+]NUM            output the last NUM lines, instead of the last 10;
                              or use -n +NUM to output starting with line NUM

したがって、-n +2の場合、最初の行をスキップする必要があります。

末尾のソート形式を使用することもできます:tail +2

28
user1794469

-h-オプションを使用して、squeueのヘッダー行を抑制することができます。これにより、最初の行を削除する必要がなくなります。

squeueのmanページ から:

-h, --noheader
    Do not print a header on the output.
43
Bex

ちょうど楽しみのために。あなたはトイレの出力から1を演習することができます

echo $(( $(squeue -u user_name|wc -l)-1 ))

または

squeue -u user_name|wc -l|awk '{print $0-1}'

Awkを使用すると、awkで行を数えることができるので、wcを避けます

squeue -u user_name|awk 'END{print NR-1}'

ENDは、すべての行が読み取られた後に次のブロックが実行されることを意味し、NRは、これまでに読み取られた行数を意味します。

5
miracle173

実際、同じ結果を得るにはいくつかの方法があります。もう1つの方法は、次のように、sequenceコマンドの出力をsedにパイプすることです。

squeue -u user_name | sed '1d' | wc -l

2
kokei