如何通过 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
如何用“终端”替换 TTY 的行?
答案1
ps
1.如何使用打印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]*
零个或多个数字