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
pswith打印 tty 列sed?ps | sed 's/ *[^ ]* *\([^ ]*\).*/\1/'
Run Code Online (Sandbox Code Playgroud)
我将?用于空格字符。
s/A/B/- substituteA由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 – 字符串 terminalps | 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]* 零个或多个数字