特定の文字列の後に数値をgrepする正規表現


回答:


14

これを試して:

grep -oP '(?<=ID: )[0-9]+' file

または:

perl -nle 'print $1 if /ID:.*?(\d+)/' file

返信いただきありがとうございますが、私は、ファイルからのすべての数字が必要にIDの後に発生した数だけ必要はありません:
ブレイクギブス

私の答えを更新しました。
cuonglm 2014年

1
-o-PはGNUの拡張機能であることに注意してくださいgrep-oBSDでも動作します。PCREのサポート-Pは、常にコンパイルされるわけでもありません。
マット

4

一致するセグメントのみを取得するにはegrep、with -oまたはgrepwith -Eoオプションを使用します。[0-9]正規表現として使用して、数値のみを取得します。

grep -Eo [0-9]+ filename

1
OPは、特定の文字列の後でのみ一致する必要があります。質問のタイトルをご覧ください。
terdon

4

これを行うには多くの方法があります。例えば:

  1. grep最近のPCREでGNU を使用し、その後の数字を照合しますID:

    grep -oP 'ID:\s*\K\d+' file
    
  2. awkで始まるすべての行の最後のフィールドを使用して印刷するID:

    awk '/^ID:/{print $NF}' file
    

    ただし、数値ではないフィールドも出力されます。数値のみを取得し、2番目のフィールドのみを取得するには、次を使用します。

    awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
    
  3. GNU grepを拡張正規表現とともに使用して、2回解析します。

    grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
    

ありがとう!\K最初の例では何をしていますか?
rnd_d 2015年

2
@rnd_dこれは、Perl互換の正規表現(PCRE)構造であり、「この時点までに一致するものをすべて無視する」ことを意味します。これは後読みのように使用されます。これを使用して-o、一致した部分だけを印刷するだけでなく、興味のないものも破棄します。比較echo "foobar" | grep -oP "foobar"してecho "foobar" | grep -oP 'foo\Kbar'
terdon

4
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'

これはID: 54376、ファイル入力の後に発生するすべての数字とスペースのみを出力します。

{numeric、space}以外の文字を削除した後、空白行を削除し*ないように少し速くするために、上記を少し更新しましたp

これは、正規表現の行に対処し/ID: 54376/ ,$最後とそれらにs///すべてまたは削除*文字は^ない[^ 0-9]*、その後prints /任意の/持つ行.の残りの文字を。

デモ:

{
echo line 
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'

出力:

 54376
1  03  2
3  03  4
5  03  6
7  03  8
9  03  10
 54376

1

sedの使用:

{
    echo "ID: 1"
    echo "Line doesn't start with ID: "
    echo "ID: Non-numbers"
    echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'

-n「デフォルトでは何も印刷しない」で、/^ID: [0-9][0-9]*$/(:、その後、1桁以上は、その行の終わり「ID」で始まる)、および「この正規表現にマッチする行を」であるs/ID: //pの形式ですs/pattern/repl/flags- s手段我々 '置換を行って、フラグを使用してパターン"ID: "を置換テキスト""(空の文字列)で置換しますp。これは、「置換の後にこの行を印刷する」ことを意味します。

出力:

1
4

IDが行の中央にある場合は機能しません。
Avinash Raj 2014

私の質問の読みに基づいて、それもすべきではありません。そして、そのケースを時期尚早に処理しようとしないことで、コードがよりシンプルで移植性の高いものになります。
godlygeek

0

別のGNU sedコマンド、

sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file

それは後に任意の数を印刷します ID:


あなたは本当に必要ありません+。1文字と3文字の違いがスクリプトがすべてので機能しないsed場合は、おそらく次のようにしてくださいsed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'。また、ID: [0-9]2つのの出現を含む行の最初の回答も欠落していID: [0-9]ます。
mikeserv 2014年

0

grep + awkを使用します。

  grep "^ID" your_file | awk {'print $2'}

ボーナス:読みやすい:)


1
grepを使用してawkいる場合は必要ありません。 awk '/^ID/ { print $2 }'同じことを行い、grep行バッファリングの問題を回避します。また、@ terdonの回答のソリューションの1つとほとんど同じです。
cas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.