As others noted, lists:filter/2 returns a list, even if it is only one item. The function you are looking for is lists:keyfind/3 (in Erlang R14B03, for R13B04 and earlier, use lists:keysearch/3 ):
Eshell V5.8.4 (abort with ^G) 1> rd(user, {pid, name, nick}). user 2> Users = [#user{pid = spawn(fun() -> ok end), name = name1, nick = nick1}, 2> #user{pid = spawn(fun() -> ok end), name = name2, nick = nick2}, 2> #user{pid = spawn(fun() -> ok end), name = name3, nick = nick3}]. [#user{pid = <0.34.0>,name = name1,nick = nick1}, #user{pid = <0.35.0>,name = name2,nick = nick2}, #user{pid = <0.36.0>,name = name3,nick = nick3}] 3> lists:keysearch(pid(0,35,0), #user.pid, Users). {value,#user{pid = <0.35.0>,name = name2,nick = nick2}} 4> lists:keyfind(pid(0,35,0), #user.pid, Users). #user{pid = <0.35.0>,name = name2,nick = nick2} 5> lists:keyfind(pid(0,99,0), #user.pid, Users). false
lists:keyfind/3 is preferred because it is simpler.
Using only #user.pid returns the position of the pid field in the #user :
6> #user.pid. 2