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


58

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

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

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

grep [0-9] filename

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

blah blah blah (:34)

むしろ私だけが欲しい34。そうする方法はありますか?


将来的には、grep(またはその他のプログラム)のmanページもチェックしてください。マニュアルページには、プログラムの多くの一般的な使用に必要なオプションの詳細が記載されています。例man grep
-hnasarat

これを試すことができます> grep -o '[0-9] [0-9] *' testfile

回答:


76

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回以内でなければなりません。

お役に立てれば


3
いいね また、4桁以上または任意の桁数と一致させるには、次を使用します grep -Eo '[0-9]{1,}' testfile
FractalSpace 14

9

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

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

5

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


1

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/ます。


1
curl単純な場合に使用するのはなぜcatですか?
PerlDuck

質問は、ファイルがローカルであることを明確に述べていません。この答えは両方を可能にします。
スティーフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.