私はコマンドを持っています:
ps -ef | grep kde | tr -s ' ' '@'
私は次のような出力を得ています:
user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere
Linux または awk のようなその他の方法を使用して、列を分離するためだけに @ 記号を取得するにはどうすればよいですか?
を使用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
ください。
厄介ですが、機能します。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")}'
'@' を列/フィールド セパレータとして使用して出力を処理する場合は、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