2017-11-24 5 views
1

私はexのファイルリストを持っています。Grep指定された文字列を含むファイルのリストで、ファイル名と希望するデータを出力します

user1.txt 
user2805927.txt 
admin.txt 

し、各ファイルにそこのようないくつかの件のデータです:

unwanted data line1 
unwanted data line2 
unwanted data line n 

Usage · 220 
other lines that I don't need 

と私はちょうど番号「220」を取得したいし、それが各ファイルに問題の一つ

異なっています、私はパテに書くことができない記号· ALT CODE + 250 があります

出力ファイル名+データを取得する方法はありますか:

あなた は、任意の文字コードについて grepでき
users1.txt | 220 
user2805927.txt | 85 
admin.txt | 18 
+0

どの程度Usage'が、その後の後にすべての非数字をスキップし、最終的に捉える '見つけた正規表現をしています数? –

+0

'grep -o ...'を使用してくださいそれはそれを行う必要があります – Dominique

+0

@ PM77-1ええ、条件は以前の文字列 'Usage'を持っていますが、このシンボルALT + 250は私を許可していません –

答えて

1

(例外のカップルと - 0と255は、GNU grepに内部的に使用されています)。

xargs grep -o $'\xfa.*' -m 1 <filenames.txt 

バッシュ「C-スタイル」の文字列$'...'あなたが進文字コード\xfa(250を10進数に相当)とgrep -oを使用することだけに一致し、全体ではなく、ラインを印刷すると言うことができます。 -m 1では、いくつかの場合に備えて、各ファイルの最初の一致に制限します。 xargsは、grepをファイル内のファイル名でコマンドライン引数として実行すると言います。これにより、grepはそれぞれの一致の前にファイル名を出力します。

users1.txt:· 220 
user2805927.txt:· 85 
admin.txt:· 18 

この出力を後処理として練習問題として残しました。 (あなたはgrep -Pを持っている場合、あなたは簡単に試合から除外するために進コードの後に​​\\Kを置くことができます。)ここで

sedバリエーションです:

xargs -n 1 -i sed -n '/^Usage [^0-9]*/!d;s//{} | /p;q' {} <filenames.txt 

現在の行が正規表現と一致しない場合それを削除し、次の行からやり直してください。それ以外の場合は、現在のファイル名(xargs -iはファイル名に{}を置き換えます)と一致するものを置き換えて、その行を出力してから、現在のファイルの処理を終了します。 xargs -n 1は、各ファイル名のsedコマンドの新しい呼び出しを実行するように言います(これはとにかくとにかくそう暗示-iによって必要とされるが。)

+0

あなたが見る文字に実際に文字コード250がないと推測します。現代のシステムでは、おそらくUTF-8としてエンコードされたUnicode文字です。この答えを適応させることは、実際にこのことが何を意味するのかを実際に理解することはあまり難しいことではありません。そうでなければ、このボックスはそれを説明するには小さすぎます。 – tripleee

+0

また、 'grep -P -o -m 1 '^ Usage \ s + [^ \ s \ d] + \ s + \ K \ d +''で、正確な文字コードを心配する必要はありません。 'grep -P'がない場合は' sed'と同じです。 – tripleee

関連する問題