我有多个进程正在运行,如下所示:
User 18870 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1234 -c 1234-SM
User 18871 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1264 -c 1264-SM
User 18872 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1634 -c 1634-SM
User 18873 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 2334 -c 2334-SM
我只想获得 的输出-Number 1234
,该数字因进程而异。所以,我需要输出类似下面的内容
-Number 1234
-Number 1264
-Number 1634
-Number 2334
或者没有数量会更好
1234
1264
1634
2334
答案1
使用awk
awk '{print $21}'
$21
考虑到默认分隔符是空格,您的预期输出所在的位置在哪里。
$ echo "User 18870 1 1 09:44 ? 00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true -Number 1234 -c 1234-SM" | awk '{print $21}'
1234
答案2
使用 GNUgrep
或兼容:
ps -wwAo args= | grep -Po '^java.* -Number\s+\K\S+'
-o
是一个 GNUgrep
扩展,告诉它输出匹配的部分,而不是至少有一个匹配的行。
-P
是另一个 GNUgrep
扩展,它告诉它使用与 perl 兼容的正则表达式而不是基本的正则表达式。
\K
是一个 Perl 正则表达式运算符,用于重置匹配部分的开头。因此,匹配的部分将是后面的一个或多个 ( +
) 非空白字符 ( )的序列。\S
-Number<whitespaces>
ps -Ao args=
是列出所有进程的所有参数列表的 POSIX 命令(用空格连接)。是一些实现-w
支持的扩展ps
更宽的(因为许多ps
实现否则会截断它)。
答案3
更安全、更简单的解决方案可能是使用您用于列出进程的工具提供的过滤功能。
也就是说,使用 时sed
,着眼于可移植性并尽量减少误报,您可以通过以下方式传输文本:
sed -n -e 's/.*[[:blank:]]\{1,\}-Number[[:blank:]]\{1,\}\([0123456789]\{1,\}\).*/\1/p'
当一行包含一个或多个空白字符、后跟文字、-Number
后跟一个或多个空白字符、后跟一个或多个数字时,整行将替换为捕获的数字序列(括在 中的部分\(
\)
)并打印结果。
请注意,如果以上序列在一行中重复多次,则仅打印第一个数字。
更简洁的 AWK 替代方案,假设-Number
和 以下数字序列由单个空格分隔,如数据示例中所示:
awk -v RS=' ' '/^-Number$/ { getline; print; }'
这将每个单空格分隔的字符串视为一条记录。当-Number
找到完全由该字符串组成的记录时,将读取并打印下一条记录。
答案4
将 grep 与 oE 结合使用
grep -oE "\-Number(.*?)\s-" | grep -oE [[:digit:]]+
-o -> 仅输出匹配的字符串 -E -> 扩展正则表达式