行内の数字をGrepする

行内の数字をGrepする

以下の 2 つの出力を取得する必要がありますか?

入力

/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

2番目については:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
  • -PPerl正規表現を有効にする
  • -o一致する部分のみを印刷します
  • IBM/WebSphere/\K\K対応する変数を空にするまでの部分の始まりなので、これは印刷されるものの一部にはなりません。
  • [0-9]\.[0-9]数字の後にドットが続き、さらに別の数字が続きます。
    • .*java2 番目では、Java コマンドの最後まで (javaスペースが続くまで) 一致させる必要があります。

答え2

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

出力のように見えますpsが、もしそうなら、検索するコマンドの引数を含めるのは間違いでしょう。これは特に、grep結果をpingする場合に当てはまります。.*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
    

    なぜなら、すべてのシーケンスが見つかり、入力の2行目には2つのシーケンスがあるからです。しかし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

grepPCRE ( ) で使用する場合-P:

最初の1つ:

$ 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
  • 最初のケースでは、xとyの両方が数字である/\K[[:digit:].]+(?=/)形式で数値を取得します。/x.y/

  • /\K[[:digit:].]+/[^ ]+/x.y/2番目のケースで必要な部分であるスペースから始まる部分文字列を探します。

関連情報