使用 sed 打印和替换 ps 命令输出中的文本

使用 sed 打印和替换 ps 命令输出中的文本
  1. 如何通过 sed 从 ps 打印 tty 列?

      PID      TTY        TIME CMD
    13445    pts/7    00:00:00 bash
    15286    pts/7    00:00:00 sort
    15336    pts/7    00:00:00 sort
    18896    pts/7    00:00:00 sed
    19387    pts/7    00:00:00 ps
    
  2. 如何用“终端”替换 TTY 的行?

答案1

ps1.如何使用打印tty列sed

ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'

解释

我将使用它来表示空格字符。

  • s/A/B/–每行s替换A一次B
  • ␣*– 0 个或更多空格
  • [^␣]*– 0 个或多个字符不是^) 空间
  • \(…\)– 一个组,转义括号内的所有内容都会被保存,因为\1它是这里的第一个组
  • .*– 除换行符之外的任何字符出现 0 次或多次
  • \1– 调用之前保存的组

其他方法

ps -o tt
ps | awk '{print $2}'

2.如何用“终端”替换TTY行?

ps | sed '2,$s/\([^0-9 ][^ ]*\)/terminal/'

解释

  • 2,$– 处理从第二行到最后一行的每一行(因此省略第一行)– 我假设您希望TTY保留标题,如果不保留,则省略这一行。
  • [^0-9␣]– 除下列字符之外的任意一个字符:0123456789␣
  • terminal– 字符串terminal

替代方法

ps | sed '2,$s/\([0-9 ]*\)[^ ]*/\1terminal/'
ps | awk '{$2="terminal";print}' # change every line
ps | awk '{if(NR>1){$2="terminal"};print}' # omit first line

答案2

ps有很多选项 - 您不需要解析它来获取您想要的输出(同样适用于许多命令,但这尤其无用,ps因为您获得的输出将包括解析输出的程序......)

如果你真的想要,你可以解析它以打印 TTY 列,如下sed所示:

$ ps | sed -r 's/^ +[^ ]+ +([^ ]+) .*/\1/'
TTY
pts/4
pts/4
pts/4

笔记

  • -r使用扩展正则表达式
  • s/old/new/old用。。。来代替new
  • ^行首
  • +一个或多个前一个字符
  • ([^ ]+)稍后保存一些非空格字符
  • .*任意数量的任意字符
  • \1反向引用已保存的模式

您可以像这样替换 pts 文本:

$ ps | sed 's:pts/\?[0-9]*:terminal:'
  PID TTY          TIME CMD
 3379 terminal    00:00:00 bash
 3466 terminal    00:00:00 ps
 3467 terminal    00:00:00 sed

笔记

  • s:old:new:old用。。。来代替new
  • \?零个或一个前一个字符
  • [0-9]*零个或多个数字

相关内容