我有一个只有一行的file.txt,其内容为
/app/jdk/java/bin/java -server -Xms3g -Xmx3g -XX:MaxPermSize=256m -Dweblogic.Name=O2pPod8_mapp_msrv1_1 -Djava.security.policy=/app/Oracle/Middleware/Oracle_Home/wlserver/server/lib/weblogic.policy -Djava.security.egd=file:/dev/./urandom -Dweblogic.ProductionModeEnabled=true -Dweblogic.system.BootIdentityFile=/app/Oracle/Middleware/Oracle_Home/user_projects/domains/O2pPod8_domain/servers/O2pPod8_mapp_msrv1_1/data/nodemanager/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Dweblogic.nmservice.RotationEnabled=true -Dweblogic.security.SSL.ignoreHostnameVerification=false -Dweblogic.ReverseDNSAllowed=false -Xms8192m -Xmx8192m -XX:MaxPermSize=2048m -XX:NewSize=1300m -XX:MaxNewSize=1300m -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
当我这样做
cat file.txt | grep -io "Xms.*" | awk '{FS" "; print $1} ' | cut -d "s" -f2
输出:
3g
为什么grep无法读取第二次出现的内容,即我希望3g和8192m。 实际上,在这种情况下如何打印仅8192m?
答案 0 :(得分:1)
您的正则表达式只是说“找到Xms,然后重复0到n次”。从Xms开始返回该行的其余部分。
您真正想要的是“找到Xms,然后输入所有内容,直到空白重复0到n次”。
grep -io "Xms[^ ]*" file.txt | awk '{FS" "; print $1} ' | cut -d "s" -f2
在[^ ]
中,^
的意思是“不是”
答案 1 :(得分:0)
您可以使用grep -io "Xms[0-9]*[a-zA-Z]"
而不是grep -io "Xms.*"
来匹配数字序列,后跟单个字符而不是单个组中的整行:
cat file.txt | grep -io "Xms[0-9]*[a-zA-Z]" | awk '{FS" "; print $1} ' | cut -d "s" -f2
希望这会有所帮助!
答案 2 :(得分:0)
我不确定您要在这里实现什么,但是如果您想要以-Xms
开头的所有以空格分隔的字符串的结尾,则使用裸awk是:
$ awk -v RS=" " '/^-Xms/{print substr($0,5)}' file
3g
8192m
解释:
$ awk -v RS=" " ' # space separated records
/^-Xms/ { # strings starting with -Xms
print substr($0,5) # print starting from 5th position
}' file
如果您还想要其他内容(标题中的单词重复使我有些困惑),请使用更详细的要求更新问题。
编辑:我只是注意到在这种情况下如何只打印8192m (也许是重复)。让我们添加一个计数器c
,而不打印第一个实例:
$ awk -v RS=" " '/^-Xms/&&++c>1{print substr($0,5)}' file
8192m
答案 3 :(得分:0)
您的正则表达式中的.*
与其余行匹配,您需要[^ ]*
来代替。看:
$ grep -o 'Xms.*' file
Xms3g -Xmx3g -XX:MaxPermSize=256m -Dweblogic.Name=O2pPod8_mapp_msrv1_1 -Djava.security.policy=/app/Oracle/Middleware/Oracle_Home/wlserver/server/lib/weblogic.policy -Djava.security.egd=file:/dev/./urandom -Dweblogic.ProductionModeEnabled=true -Dweblogic.system.BootIdentityFile=/app/Oracle/Middleware/Oracle_Home/user_projects/domains/O2pPod8_domain/servers/O2pPod8_mapp_msrv1_1/data/nodemanager/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Dweblogic.nmservice.RotationEnabled=true -Dweblogic.security.SSL.ignoreHostnameVerification=false -Dweblogic.ReverseDNSAllowed=false -Xms8192m -Xmx8192m -XX:MaxPermSize=2048m -XX:NewSize=1300m -XX:MaxNewSize=1300m -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
$ grep -o 'Xms[^ ]*' file
Xms3g
Xms8192m
$ grep -o 'Xms[^ ]*' file | cut -d's' -f2
3g
8192m
$ grep -o 'Xms[^ ]*' file | cut -d's' -f2 | tail -1
8192m
或更简洁:
$ sed 's/.*Xms\([^ ]*\).*/\1/' file
8192m
答案 4 :(得分:0)
PCRE的positive lookbehind
(格式为(?<=RE1)RE2
)可以轻松解决问题:
$ grep -oP '(?<=Xms)\S+' file.txt
3g
8192m
说明:
-o
:仅显示匹配PATTERN的行的一部分。-P
:PATTERN是Perl正则表达式。(?<=Xms)\S+
:匹配紧随字符串non-whitespace
之后的所有连续Xms
字符串。