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

Ktg*_*gvb 2 command-line bash tty sed

  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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如何用“终端”替换 TTY 的行?

des*_*ert 10

1. 如何从pswith打印 tty 列sed

ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'
Run Code Online (Sandbox Code Playgroud)

说明

我将?用于空格字符。

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

替代方式

ps -o tt
ps | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

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

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

说明

  • 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
Run Code Online (Sandbox Code Playgroud)


Zan*_*nna 7

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

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

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

笔记

  • -r 使用扩展正则表达式
  • s/old/new/替换oldnew
  • ^ 行首
  • + 一个或多个前面的字符
  • ([^ ]+) 稍后保存一些非空格字符
  • .* 任意数量的任意字符
  • \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
Run Code Online (Sandbox Code Playgroud)

笔记

  • s:old:new:替换oldnew
  • \? 零或前一个字符
  • [0-9]* 零个或多个数字