Parse ps' “etime” output and convert it into seconds

后端 未结 14 1937
难免孤独
难免孤独 2020-12-30 12:43

These are possible output formats for ps h -eo etime

21-18:26:30
   15:28:37
      48:14
      00:01

How to parse them into se

相关标签:
14条回答
  • 2020-12-30 13:24

    Yet another bash solution, which works any number of fields:

    ps -p $pid -oetime= | tr '-' ':' | awk -F: '{ total=0; m=1; } { for (i=0; i < NF; i++) {total += $(NF-i)*m; m *= i >= 2 ? 24 : 60 }} {print total}'

    Explanation:

    1. replace - to : so that string becomes 1:2:3:4 instead of '1-2:3:4', set total to 0 and multiplier to 1
    2. split by :, start with the last field (seconds), multiply it by m = 1, add to total second number, m becomes 60 (seconds in a minute)
    3. add minutes fields multiplied by 60, m becomes 3600
    4. add hours * 3600
    5. add days * 3600 * 24
    0 讨论(0)
  • 2020-12-30 13:24

    Here's mine Perl one liner:

    ps -eo pid,comm,etime | perl -ane '@t=reverse split(/[:-]/,$F[2]); $s=$t[0]+$t[1]*60+$t[2]*3600+$t[3]*86400; print "$F[0]\t$F[1]\t$F[2]\t$s\n"'
    

    Undefined values are rendering to zero, so they won't have effect on the sum of seconds.

    0 讨论(0)
提交回复
热议问题