
Мне нужно получить два следующих результата?
Вход
/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 , существует очень много возможных ответов.
Глупые
printf "7.0\n8.5\n"
printf "7.0/UpdateInstaller/java/jre/bin/java\n8.5/AppServer/java_1.7_64/jre/bin/java\n"
Преимущество этого метода в том, что вам даже не нужно читать входные данные.
Моя лучшая догадка о том, чего вы на самом деле хотите
Это становится немного сложнее, так как
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
grep -o "[0-9]\.[0-9][^ ]*"вход
получает каждую последовательность непустых символов, начинающуюся с . не получает строку сам по себе, поскольку включен в строку.
digit.digit
1.7
8.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/
до пробела, который является нашей желаемой частью во втором случае