2

ps auxLinuxの コマンドで取得できるファイルがあります。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2280   732 ?        Ss   08:20   0:00 init [2]  
root       327  0.0  0.1   2916  1456 ?        Ss   08:20   0:00 udevd --daemon
root      1681  0.0  0.0   2376   800 ?        Ss   08:20   0:00 /sbin/rpcbind -w
root      2071  0.0  0.1  27920  1708 ?        Sl   08:20   0:00 /usr/sbin/rsyslogd -c5

次のような最後のフィールドの内容を取得したい:

COMMAND
init [2]
udevd --daemon
/sbin/rpcbind -w
/usr/sbin/rsyslogd -c5

$ awk '{print $11}' テストを使用すると、次のようになります。

COMMAND
init
udevd
/sbin/rpcbind
/usr/sbin/rsyslogd

$ awk '{print $12}' テストを使用すると、次の結果が得られます。

[2]
--daemon
-w
-c5

どのようにできるのか?

4

5 に答える 5

6
awk '{for(i=1;i<11;i++)$i="";print }'

または、次のことができます。

awk '{print $11,$12}'
于 2013-01-21T03:51:19.293 に答える
2

最後のフィールドの単語をループして出力できます。

ps aux | awk '{ for( i=11 ; i <=NF ; i++ ) { printf( "%s ", $i ) } ; print "" }'

コマンドを後で処理したい場合は、変数に入れることができます。

ps aux | awk '{ CMD = "" ; for( i=11 ; i <=NF ; i++ ) { CMD = CMD " " $i } ; sub( /^ /, "", CMD ) ; print CMD }'
于 2013-01-21T06:38:45.533 に答える
1

awkを使用する必要がない場合は、以下も機能します。

ps aux | tr -s ' ' ' ' | cut -d' ' -f11-

それを少し解読します。ps列をスペースで区切るため、

tr -s ' ' ' '

繰り返されるスペースの文字列(最初の文字列[''の最初のセット]で指定)を単一のスペース(2番目の文字列で指定)に置き換えます。これで、フィールドが1つのスペースで区切られるようになったため、次を使用できます。

cut -d' ' -f11-

これは、フィールドがスペース('-d'の後の文字)で区切られ、行の終わりまでのフィールド11('-f11-'として示される)を選択することを意味します。

これは一見すると少し複雑に見えるかもしれませんが、コツをつかめば、分離された値の文字列の解析が本当に簡単になります。

于 2013-01-21T04:04:22.403 に答える
1

上記の出力の場合、これは機能するはずです。

ps aux | cut -c66-

注: 最後の「-」に注意してください。取り逃すと66文字目しか手に入らない!!!

ただし、これを毎回機能させるには、COMMAND列を 66 文字目から開始する必要があります。異なる場合は、COMMAND列の番号をメモし、カット コマンドを次のように変更します。

cut -c<column#>-
于 2015-11-10T23:52:30.700 に答える