Ktg*_*gvb 2 command-line bash tty sed
如何通过 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)如何用“终端”替换 TTY 的行?
des*_*ert 10
ps
with打印 tty 列sed
?ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'
Run Code Online (Sandbox Code Playgroud)
我将?
用于空格字符。
s/A/B/
- s
ubstituteA
由B
每行一个时间?*
– 0 个或多个空格[^?]*
– 0 个或多个不是( ^
) 空格的字符\(…\)
– 一个组,转义括号内的所有内容都被保存,\1
因为它是这里的第一组.*
– 除换行符以外的任何字符出现 0 次或多次\1
– 调用之前保存的组ps -o tt
ps | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
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)
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/
替换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
Run Code Online (Sandbox Code Playgroud)
s:old:new:
替换old
为new
\?
零或前一个字符[0-9]*
零个或多个数字