{"id":86,"date":"2025-02-01T22:33:10","date_gmt":"2025-02-01T22:33:10","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2008\/11\/24\/a-script-to-list-the-clients-in-descending-access-date-order\/"},"modified":"2025-02-01T22:39:29","modified_gmt":"2025-02-01T22:39:29","slug":"a-script-to-list-the-clients-in-descending-access-date-order","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/a-script-to-list-the-clients-in-descending-access-date-order\/","title":{"rendered":"Ruby and Perl Scripts to List Perforce Clients in Descending Access Date Order"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<p>These scripts will:<br>\u2705 Connect to the <strong>Perforce server<\/strong><br>\u2705 Retrieve a <strong>list of clients (workspaces)<\/strong><br>\u2705 Sort them by <strong>last access date (descending order)<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Prerequisites<\/strong><\/h2>\n\n\n\n<p>Before running the scripts, ensure:<br>\u2714 <strong>Perforce CLI (<code>p4<\/code>)<\/strong> is installed and accessible in <code>PATH<\/code><br>\u2714 You have <strong>Perforce credentials<\/strong> (server, username)<br>\u2714 You can run <code>p4 clients -l<\/code> successfully in the command line<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>2. Ruby Script: List Perforce Clients by Last Access Date<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/usr\/bin\/env ruby<\/span>\n\n<span class=\"hljs-comment\"># Define Perforce server details<\/span>\nP4PORT = <span class=\"hljs-string\">\"perforce.company.com:1666\"<\/span>\nP4USER = <span class=\"hljs-string\">\"your_username\"<\/span>\n\n<span class=\"hljs-comment\"># Run 'p4 clients -l' command and capture output<\/span>\nclients_output = `p4 -p <span class=\"hljs-comment\">#{P4PORT} -u #{P4USER} clients -l`<\/span>\n\n<span class=\"hljs-comment\"># Parse the output and extract client name and access date<\/span>\nclients = &#91;]\nclients_output.split(<span class=\"hljs-string\">\"\\n\\n\"<\/span>).each <span class=\"hljs-keyword\">do<\/span> |entry|\n  client = entry.match(\/^Client (\\S+)\/)&amp;.captures&amp;.first\n  access_time = entry.match(\/^Access:\\s+(\\d+)\/)&amp;.captures&amp;.first.to_i\n  \n  clients &lt;&lt; { name: client, access: access_time } <span class=\"hljs-keyword\">if<\/span> client &amp;&amp; access_time &gt; <span class=\"hljs-number\">0<\/span>\nend\n\n<span class=\"hljs-comment\"># Sort clients by last access date (descending order)<\/span>\nsorted_clients = clients.sort_by { |c| -c&#91;:access] }\n\n<span class=\"hljs-comment\"># Print results<\/span>\nputs <span class=\"hljs-string\">\"Perforce Clients Sorted by Last Access Date (Descending):\"<\/span>\nsorted_clients.each <span class=\"hljs-keyword\">do<\/span> |client|\n  puts <span class=\"hljs-string\">\"#{client&#91;:name]} - Last Access: #{Time.at(client&#91;:access])}\"<\/span>\nend\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>How to Run the Ruby Script<\/strong><\/h3>\n\n\n\n<p>1\ufe0f\u20e3 Save the script as <strong><code>list_p4_clients.rb<\/code><\/strong><br>2\ufe0f\u20e3 Replace <code>\"perforce.company.com:1666\"<\/code> and <code>\"your_username\"<\/code> with your actual <strong>Perforce server details<\/strong><br>3\ufe0f\u20e3 Open a terminal and run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ruby<\/span> <span class=\"hljs-selector-tag\">list_p4_clients<\/span><span class=\"hljs-selector-class\">.rb<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>3. Perl Script: List Perforce Clients by Last Access Date<\/strong><\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/usr\/bin\/perl<\/span>\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">strict<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">warnings<\/span>;\n\n<span class=\"hljs-comment\"># Define Perforce server details<\/span>\nmy $P4PORT = <span class=\"hljs-string\">\"perforce.company.com:1666\"<\/span>;\nmy $P4USER = <span class=\"hljs-string\">\"your_username\"<\/span>;\n\n<span class=\"hljs-comment\"># Run 'p4 clients -l' command and capture output<\/span>\nmy @clients_output = `p4 -p $P4PORT -u $P4USER clients -l`;\n\n<span class=\"hljs-comment\"># Parse output to extract client name and access time<\/span>\nmy @clients;\nmy ($client, $access_time);\n<span class=\"hljs-keyword\">foreach<\/span> my $line (@clients_output) {\n    <span class=\"hljs-keyword\">if<\/span> ($line =~ \/^Client (\\S+)\/) {\n        $client = $<span class=\"hljs-number\">1<\/span>;\n    } elsif ($line =~ \/^Access:\\s+(\\d+)\/) {\n        $access_time = $<span class=\"hljs-number\">1<\/span>;\n        push @clients, { name =&gt; $client, access =&gt; $access_time } <span class=\"hljs-keyword\">if<\/span> $client &amp;&amp; $access_time;\n    }\n}\n\n<span class=\"hljs-comment\"># Sort clients by last access date (descending order)<\/span>\n@clients = sort { $b-&gt;{access} &lt;=&gt; $a-&gt;{access} } @clients;\n\n<span class=\"hljs-comment\"># Print results<\/span>\n<span class=\"hljs-keyword\">print<\/span> <span class=\"hljs-string\">\"Perforce Clients Sorted by Last Access Date (Descending):\\n\"<\/span>;\n<span class=\"hljs-keyword\">foreach<\/span> my $c (@clients) {\n    my $date = scalar localtime($c-&gt;{access});\n    <span class=\"hljs-keyword\">print<\/span> <span class=\"hljs-string\">\"$c-&gt;{name} - Last Access: $date\\n\"<\/span>;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>How to Run the Perl Script<\/strong><\/h3>\n\n\n\n<p>1\ufe0f\u20e3 Save the script as <strong><code>list_p4_clients.pl<\/code><\/strong><br>2\ufe0f\u20e3 Replace <code>\"perforce.company.com:1666\"<\/code> and <code>\"your_username\"<\/code> with your actual <strong>Perforce server details<\/strong><br>3\ufe0f\u20e3 Open a terminal and run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">perl<\/span> <span class=\"hljs-selector-tag\">list_p4_clients<\/span><span class=\"hljs-selector-class\">.pl<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>4. Explanation<\/strong><\/h1>\n\n\n\n<p>\u2714 <strong><code>p4 clients -l<\/code><\/strong> retrieves <strong>all client workspaces<\/strong> with detailed info<br>\u2714 The script <strong>extracts the client name<\/strong> and <strong>last access date<\/strong><br>\u2714 Clients are <strong>sorted in descending order<\/strong> based on last access timestamp<br>\u2714 Dates are <strong>converted from epoch time<\/strong> to human-readable format<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>5. Conclusion<\/strong><\/h1>\n\n\n\n<p>This Ruby and Perl script allows you to efficiently <strong>list Perforce clients sorted by last access date<\/strong>.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>These scripts will:\u2705 Connect to the Perforce server\u2705 Retrieve a list of clients (workspaces)\u2705 Sort them by last access date (descending order) 1. Prerequisites Before running the scripts, ensure:\u2714 Perforce CLI (p4) is installed and accessible in PATH\u2714 You have Perforce credentials (server, username)\u2714 You can run p4 clients -l successfully in the command line&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3616,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[370],"tags":[380,903,1905,1910,1904,1911,545,1906,1908,278,1907,1909],"class_list":["post-86","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perforce","tag-access","tag-clients","tag-date","tag-date-order","tag-descending","tag-descending-access-date-order","tag-how","tag-order","tag-order-date","tag-script","tag-script-to-list-the-clients-in-descending-access","tag-sort"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/86\/revisions"}],"predecessor-version":[{"id":48322,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/86\/revisions\/48322"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3616"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}