join(1) の使い道
一生使うことがないだろうと思っていた join(1) を使う日がついに来た。
事の起こりは ipcs。
$ ipcs -p ------ 共有メモリ 作成者/直近の命令 -------- shmid 所有者 cpid lpid 262144 ao 5620 24536 294913 ao 5682 5335 163842 ao 5603 5335 196611 ao 5618 5335 229380 ao 5618 5335 327685 ao 5622 5335 360454 ao 5622 5335 393223 ao 5718 5335 425992 ao 5754 5335 458761 ao 5756 5335 491530 ao 5758 5335 524299 ao 5784 24098 851980 ao 5841 23823 884749 ao 5841 23823 786446 root 5335 25498 917519 ao 5665 23116 950288 ao 11877 5335 1736721 ao 24462 5335 1769492 ao 5550 5335 1802261 ao 5550 5335 ------ メッセージキュー PIDs -------- msqid 所有者 lspid lrpid
オプション -p で作成者プロセスを表示させたのだが PID だけでは何のプログラムなのかわからない。
そこで ps と join する。
$ ipcs -p | sed '1,3d; /^$/,$d; s@ \+@,@g; s@,$@@' | sort -k 3 -t, > ipcs.out $ ps -e --no-heading | sed -e 's@^ \+@@; s@ \+@,@g' | sort -k 1 -t, > ps.out $ join -t, -1 3 -2 1 ipcs.out ps.out 11877,950288,ao,5335,?,00:00:01,notification-da 24462,1736721,ao,5335,pts/1,00:00:13,java 5335,786446,root,25498,tty7,00:24:52,Xorg 5550,1769492,ao,5335,?,00:00:00,x-session-manag 5550,1802261,ao,5335,?,00:00:00,x-session-manag 5603,163842,ao,5335,?,00:00:34,scim-panel-gtk 5618,196611,ao,5335,?,00:01:57,metacity 5618,229380,ao,5335,?,00:01:57,metacity 5620,262144,ao,24536,?,00:01:07,gnome-panel 5622,327685,ao,5335,?,00:00:02,nautilus 5622,360454,ao,5335,?,00:00:02,nautilus 5665,917519,ao,23116,?,00:00:00,update-notifier 5682,294913,ao,5335,?,00:00:00,nm-applet 5718,393223,ao,5335,?,00:00:00,trashapplet 5754,425992,ao,5335,?,00:00:00,fast-user-switc 5756,458761,ao,5335,?,00:00:01,deskbar-applet 5758,491530,ao,5335,?,00:00:00,mixer_applet2 5784,524299,ao,24098,?,00:00:24,sylpheed 5841,851980,ao,23823,?,00:56:34,firefox-bin 5841,884749,ao,23823,?,00:56:34,firefox-bin
join するファイルは対象カラムでアルファベット順ソートされていないといけないので sort を使う。
それにしても ps や ipcs は余計なヘッダを出力する。