web-dev-qa-db-ja.com

grepで数値のみを取得するにはどうすればよいですか?

私はこのようなファイルを持っています:

 other lines . . .    
 blah blah blah (:34)

上記のファイルで数字の出現を見つけたい。私は思いついた:

grep [0-9] filename

しかし、それは全体を印刷しています:

blah blah blah (:34)

むしろ、34のみが必要です。そうする方法はありますか?

55
Ant's

grep -Eを使用して、拡張正規表現構文にアクセスできます(egrepと同じ)

以下の内容のテストファイルを作成しました:

>cat testfile
this is some text
with some random lines

again some text
ok now going for numbers (:32)
ok now going for numbers (:12)
ok now going for numbers (:132)
ok now going for numbers (:1324)

今、あなたが使用できるテキストから数字だけをグレップする

>grep -Eo '[0-9]{1,4}' testfile
32
12
132
1324

出力されます。

ここで"-o"は、行の内容全体ではなく、行の一致するセグメントのみを出力するために使用されます。

波線の括弧(例:{および})は、一致のインスタンスの数を示します。 {1,4}では、前の文字または文字クラスが少なくとも1回出現する必要がありますが、4回以内でなければなりません。

お役に立てれば

72
devav2

POSIX standard のセクション9.3.5で指定されたREブラケット式[:digit:]-oフラグと組み合わせて使用​​して、一致する「単語」のみを印刷できます。

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123
8

grep -oは、行の一致部分のみを出力します。それ以外の場合、grepはパターンを含む行を出力します。

5
roadmr

curlを使用してローカルまたはリモートでファイルにアクセスし、(())でラップされた数字で行をgrepし、それらの断片を切り取ってファイルに書き込みます

受け入れられた答えは、ファイルの前の行に数字がある可能性があることを無視しますが、サンプルデータでは機能しますが、ファイルがリモートの場合はどうなりますか?

ローカル

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

この例では、現在のフォルダーのoutput.txtが上書きされます。パブリックフォルダーからinput.txtにアクセスします。

リモート

curl https://yoursite.com/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

この例では、現在のフォルダーのoutput.txtが上書きされ、input.txtからhttps://yoursite.com/Public/にアクセスします。

0
Stef