awkが同じ行に3つの項目を印刷してから新しい行に切り替える方法

awkが同じ行に3つの項目を印刷してから新しい行に切り替える方法

タイムスタンプ、Memの使用、およびSwapの使用を選択するために、最上位の結果の出力を解析しようとしています。

top - 12:06:52 up  3:36, 37 users,  load average: 0.00, 0.02, 0.00
Tasks: 563 total,   1 running, 562 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65968400k total,  9594508k used, 56373892k free,   199136k buffers
Swap: 68026360k total,        0k used, 68026360k free,  5864056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
11527 root      15   0 26464 1728 1056 R  1.9  0.0   0:00.01 top                                                        

これは1つのサンプルです。これで、次のawk cmdを取得します。

awk '$1 ~/top/ {print $5;} $1 ~/Mem/ {print $4;} $1 ~/Swap/  {print $4;}' top-output

しかし、新しい行にすべてを出力するので、完璧ではありません。このように:

7:40,
12644016k
0k
7:50,
12411248k
0k 
8:04,
12795392k
0k

次のように出力したいと思います。

7:40, 12644016k, 0k
7:50, 12411248k, 0k

どうすればいいですか?ありがとう

ベストアンサー1

1つの方法は、次のものを使用することですprintf

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k 0k

printf柔軟な形式を提供し、明示的に指示しない限り、改行文字を印刷しません。最初のパラメータprintfはフォーマット文字列ですprintf。フォーマット文字列はで説明されていますman awk

print値を保存して一度だけ使用する別の方法は次のとおりです。

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36, 9594508k 0k

追加のカンマを追加

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k, 0k

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508k, 0k

剥がれるk

printfを使用すると、整数形式を指定して数値に変換して次のものを削除できますk

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%i, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508, 0k

数値に変換する別の方法は、数値にゼロを追加することです。したがって、次のものをused=$4+0代わりに使用できますused=$4

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508, 0k

稼働時間からカンマを削除

稼働時間には2つの数字の間にコロンがあり、awkはそれを数字に変換できません。これは他の方法が必要であることを意味します。出力からコンマを消去する1つの方法は、フィールド区切り文字にコンマを追加することです。

$ awk -F'[,[:space:]]+' '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36 9594508k 0k

$ awk -F'[,[:space:]]+' '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36 9594508 0k

おすすめ記事