Grep для числа в строке

Grep для числа в строке

Мне нужно получить два следующих результата?

Вход

/usr/IBM/WebSphere/7.0/UpdateInstaller/java/jre/bin/java -Declipse.security -Dwas.status.socket=48101
/home/axg009/usr/IBM/WebSphere/8.5/AppServer/java_1.7_64/jre/bin/java -Declipse.security -Dwas.status.socket=48101

Выход 1

7.0
8.5

Вывод 2

7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java

решение1

Для первого:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file

Для второго:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
  • -Pактивирует регулярные выражения Perl
  • -oпечатает только соответствующую часть
  • IBM/WebSphere/\Kначало части, до \Kкоторой очищается соответствующая переменная, поэтому это не будет частью того, что будет напечатано
  • [0-9]\.[0-9]цифра, за которой следует точка, за которой следует еще одна цифра.
    • .*javaво втором случае вы также хотите выполнить сопоставление до конца команды java (пока javaне будет пробела).

решение2

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'

Похоже, что psтам есть вывод, но если так, то, вероятно, ошибка — включать аргументы в команды, которые вы ищете. Это особенно верно, если вы grepпингуете результаты, потому что шаблон поиска для.*java.*или что-то еще, скорее всего, будет соответствовать grepвыполняемой вами команде.

К счастью, вы можете искать только по comm=названию и удалять эти результаты, как я сделал выше, что должно справиться с этой задачей.Вывод 2. Во-первых:

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\..\).*|\1|p'

Если это не так ps, то это тоже работает:

sed 's|.*/\([0-9]\.[^ ]*\).*|\1|' <in

...дляВывод 2, и...

sed 's|.*/\([0-9]\..\).*|\1|' <in

...дляВыход 1...

решение3

Так как вы этого не сделалиописанныйчто вы хотите, но показаны только входные и выходные данные 1 , существует очень много возможных ответов.

Глупые

  1. printf "7.0\n8.5\n"
  2. printf "7.0/UpdateInstaller/java/jre/bin/java\n8.5/AppServer/java_1.7_64/jre/bin/java\n"

Преимущество этого метода в том, что вам даже не нужно читать входные данные.

Моя лучшая догадка о том, чего вы на самом деле хотите

  1. Это становится немного сложнее, так как

    grep -o "[0-9].[0-9]"вход
    дает выходной результат

    7.0
    8.5
    1.7
    

    потому что он находит каждую последовательность, а их две на второй строке ввода. Ноdigit.digit

    grep -o "/[0-9].[0-9]/"вход
    дает выходной результат

    /7.0/
    /8.5/
    

    (каждая последовательность), которая может быть близка к тому, что вы хотите, а затем/digit.digit/

    grep -o "/[0-9]\.[0-9]/"вход| grep -o "[0-9]\.[0-9]"

    дает выходной результат

    7.0
    8.5
    
  2. grep -o "[0-9]\.[0-9][^ ]*"вход

    получает каждую последовательность непустых символов, начинающуюся с .  не получает строку сам по себе, поскольку включен в строку.digit.digit1.78.5/…

____________
1 Пожалуйста, всегда включайте в свои вопросы примеры входных и выходных данных. Нотакжеопишите, как вы хотите перейти от входа к выходу, иначе вы получите глупые ответы.

решение4

Использование grepс PCRE ( -P):

Первый:

$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt 
7.0
8.5

Второй:

$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt 
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
  • В первом случае /\K[[:digit:].]+(?=/)получим числа в формате /x.y/, где x и y являются цифрами.

  • /\K[[:digit:].]+/[^ ]+будет искать подстроку, указывающую от /x.y/до пробела, который является нашей желаемой частью во втором случае

Связанный контент