根据在输出中找到匹配项向命令输出添加前缀。

Adding prefix to command output based on finding match in the output.

我需要一种方法来修改命令行输出,为其添加前缀。我想我只是不理解完成这项工作所需的 SED 语法。

目标是 bash shell,它将快速显示特定服务器上的活动 WebSphere 配置文件。

我第一次尝试使用 ps -ef 命令显示活动进程,然后使用 grep 命令仅显示感兴趣的进程。这得到了预期的结果,但是 ps -ef 命令的最后一列太长而没有价值。

顺便说一下,我在 AIX 上 运行,egrep -o 不适合我。

我的第二次尝试是使用 sed -n 命令在命令输出字符串中搜索感兴趣的配置文件。这让我更接近期望的结果。

#!/usr/bin/bash

body() {
    # print the header (the first line of input)
    # and then run the specified command rest of the input
    # Usage example  ps | body grep somepattern
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

echo -e "\n-----------------------";
grepString="Cog[CGR][MWS][123]Profile"   ## Regular Expression for names of WebSphere profiles

# first attempt
ps -ef | ( body egrep $grepString | sort -k5 )  | cut -c1-180

# second attempt
ps -ef | ( body sed -n "s/.*\($grepString\).*//p" | sort -k1 ) 

我的第二次尝试产生的结果如下:

     UID     PID    PPID   C    STIME    TTY  TIME CMD
CogCM1Profile
CogCM2Profile
CogGW1Profile
CogGW2Profile
CogRS1Profile
CogRS2Profile
CogRS3Profile

现在,如果我只能附加命令输出的其余部分,我很乐意产生这样的结果。

Profile       UID      PID        PPID   C   STIME   TTY   TIME  CMD
CogCM1Profile wasadmin 3540106       1   0   Mar 11      -  3:01 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=47507 
CogCM2Profile wasadmin 3211972       1   0   Mar 11      -  3:35 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=47946 
CogGW1Profile wasadmin 1639922       1   0   Mar 11      -  4:16 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=47722 
CogGW2Profile wasadmin 3866760       1   0   Mar 11      -  7:18 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=42506 
CogRS1Profile wasadmin 3670356       1   1   Mar 11      - 20:43 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=46643 
CogRS2Profile wasadmin 3932926       1   0   Mar 13      - 12:37 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=50583 
CogRS3Profile wasadmin 2294788       1   0   Mar 13  pts/6 10:11 /APPS/IBM/WebSphere/AppServer_std/java/bin/java -Declipse.security -Dwas.status.socket=50452 

如果我正确理解您的尝试,那么

#                                               vv-- here
ps -ef | ( body sed -n "s/.*\($grepString\).*/ &/p" | sort -k1 ) 

应该可以。 & 在 sed s 命令的替换部分指的是正则表达式匹配的东西,在这种情况下是整行。

为了修复 headers,您可以添加仅涉及第一行的替换,如下所示:

ps -ef | ( body sed -n "1 s/^/Profile  /p; s/.*\($grepString\).*/ &/p" | sort -k1 )

空间量可能需要变化(我没有 AIX 来测试这些)。