根据在输出中找到匹配项向命令输出添加前缀。
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 来测试这些)。
我需要一种方法来修改命令行输出,为其添加前缀。我想我只是不理解完成这项工作所需的 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 来测试这些)。