根据输出中的查找匹配为命令输出添加前缀。

时间:2015-03-15 20:08:48

标签: sed

我需要一种方法来重做命令行输出,为它添加前缀。我想我只是不理解使这项工作所需的SED语法。

目标是一个bash shell,它将在特定服务器上快速显示Active 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\).*/\1/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 

1 个答案:

答案 0 :(得分:0)

如果我了解您正确尝试的内容,那么

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

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

为了修复标题,你可以输入一个只涉及第一行的替代品,如下所示:

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

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