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

0
Lam 3 Май 2019 в 11:35

5 ответов

Лучший ответ

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

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

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

$ awk -v RS=" " '/^-Xms/&&++c>1{print substr($0,5)}' file
8192m
0
James Brown 3 Май 2019 в 13:20

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

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

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

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

1
fancyPants 3 Май 2019 в 08:50

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

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

0
Lorenzo Addazi 3 Май 2019 в 08:57

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

$ 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
Ed Morton 4 Май 2019 в 02:37

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

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

Объясняет :

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