-2

私はコマンドを持っています:

ps -ef | grep kde | tr -s ' ' '@'

私は次のような出力を得ています:

user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere

Linux または awk のようなその他の方法を使用して、列を分離するためだけに @ 記号を取得するにはどうすればよいですか?

4

3 に答える 3

1

を使用pgrepする代わりに、PID を取得するために使用しますps。発見したプロセスの1つがフィルタリングを行っているというgreppgrepの問題を解消します。grep

またはオプションpsを使用して、コマンド自体の出力を指定することもできます。これを実行して、必要なフィールドを取得し、ヘッダーを削除できます。-o-O

read コマンドを使用して出力を解析することもできます。空白の可能性がある唯一のフィールドは、最後のフィールド、つまりコマンドと引数です。

ps -o uid= -o gid= -o tty= -o args= -p $(pgrep kde) | while read uid gid tty cmd
do
    echo "UID = $uid   PID = $pid   TTY = $tty"
    echo "Command = $cmd"
done

while空白で分割されますが$cmd、残りのすべてのフィールド (つまり、引数を含むコマンド全体) が含まれます。

コマンドはpsプラットフォームによって異なるため、 のマンページを参照してpsください。

于 2013-09-13T14:41:46.033 に答える
1

厄介ですが、機能します。ps のバリアントが出力する列の数に合わせて、数値 8 を微調整します。

ps -ef | awk -v OFS="" '{ for(i=1; i < 8; i++) printf("%s@",$i); for(i=8; i <= NF; i++) printf("%s ", $i); printf("\n")}'
于 2013-09-13T14:33:47.440 に答える
0

'@' を列/フィールド セパレータとして使用して出力を処理する場合は、awk で -F を使用できます。

echo "user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere" | awk -F'@' -v OFS='\t' '{$1=$1;print $0}'

出力:

user2131        1626    1584    0       15:50   ?       00:00:00        /bin/sh /usr/bin/startkdeere
于 2013-09-13T13:55:20.940 に答える