如何在一行上重复显示重复的字符串?

时间:2019-05-03 08:35:58

标签: grep

我有一个只有一行的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?

5 个答案:

答案 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字符串。