Как получить повторяющиеся строки в одной строке? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть файл 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.Infact, как мне печатать только 8192 м в этом случае?

Ответы [ 5 ]

1 голос
/ 03 мая 2019

Ваше регулярное выражение просто говорит: "найдите Xms, а затем все, что повторяется от 0 до n раз".Это возвращает остаток строки от Xms и далее.

То, что вы на самом деле хотите, это что-то вроде «найти Xms, после чего что-нибудь, пока не пропустите пробел от 0 до n раз».

grep -io "Xms[^ ]*" file.txt | awk '{FS" ";  print $1} ' | cut -d  "s" -f2

В [^ ] ^ означает «не«

0 голосов
/ 04 мая 2019

positive lookbehind PCRE (форма: (?<=RE1)RE2) может легко решить проблему:

$ grep -oP '(?<=Xms)\S+' file.txt
3g
8192m

Объясняет:

  • -o: показать толькочасть строки, соответствующая PATTERN.
  • -P: PATTERN является регулярным выражением Perl.
  • (?<=Xms)\S+: соответствует всем непрерывным non-whitespace строкам, которые следуют только за строкой Xms.
0 голосов
/ 04 мая 2019

.* в вашем регулярном выражении соответствует остальной части строки, вам нужно [^ ]*. Посмотрите:

$ 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
0 голосов
/ 03 мая 2019

Я не совсем уверен, чего вы здесь добиваетесь, но если вы хотите, чтобы окончания всех разделенных пробелами строк начинались с -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

Если вы хотите что-то еще (слово повторяется в названии немного озадачивает меня), пожалуйста, обновите вопрос с более подробными требованиями.

Редактировать : Я только что заметил как мне печатать только 8192 м в этом случае (это может быть повтор возможно). Давайте добавим счетчик c и не будем печатать первый экземпляр:

$ awk -v RS=" " '/^-Xms/&&++c>1{print substr($0,5)}' file
8192m
0 голосов
/ 03 мая 2019

Вы можете использовать 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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...