私はコマンドを持っています:
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