6

テキストと数字の両方を含むテキストファイルがあります。たとえば、次のようなファイルを指定して、grepを使用して必要な数字のみを抽出したいと思います。

miss rate 0.21  
ipc 222  
stalls n shdmem 112

つまり、がであるデータのみを抽出したいとしmiss rateます0.21。grepまたはsedでそれを行うにはどうすればよいですか?さらに、後の番号だけでなく、複数の番号が必要miss rateです。つまり、との両方を取得したい場合が0.21あり112ます。サンプル出力は次のようになります。

0.21 222 112

原因後でプロットするためのデータが必要です。

4

6 に答える 6

7

本当にこれに grep だけを使用したい場合は、次を試すことができます。

grep "miss rate" file | grep -oe '\([0-9.]*\)'

最初に一致する行を見つけてから、数字のみを出力します。

ただし、Sed の方が読みやすいかもしれません。

sed -n 's#miss rate ##p' file
于 2013-03-12T20:43:21.073 に答える
5

awk代わりに使用してください:

awk '/^miss rate/ { print $3 }' yourfile

grep だけでそれを行うには、次のような非標準の拡張機能が必要です。GNU grep では PCRE (-P) と正の後読み (?<=..) および一致のみ (-o) を使用します。

grep -Po '(?<=miss rate ).*' yourfile
于 2013-03-12T20:35:50.230 に答える
4

grep-and-ソリューションは次のcutようになります。

grep の使用が成功するたびに 3 番目のフィールドを取得するには:

grep "^miss rate " yourfile | cut -d ' ' -f 3

または、3 番目のフィールドと残りのフィールドを取得するには:

grep "^miss rate " yourfile | cut -d ' ' -f 3-

または、bash を使用していて、「ミス率」がファイル内で 1 回だけ発生する場合は、次のようにすることもできます。

a=( $(grep -m 1 "miss rate" yourfile) )
echo ${a[2]}

あなたの結果はどこに${a[2]}ありますか。

「ミス率」が複数回発生する場合は、必要なものだけを読み取る grep 出力をループできます。(バッシュで)

于 2013-03-12T22:05:17.483 に答える
4

を使用したエンジンで正規表現トリック\Kの特別なルックを使用する:

grep -oP 'miss rate \K.*' file.txt

またはで:

perl -lne 'print $& if /miss rate \K.*/' file.txt
于 2013-03-12T21:03:59.547 に答える
0

以下を使用できます。

grep -P "miss rate \d+(\.\d+)?" file.txt

また:

grep -E "miss rate [0-9]+(\.[0-9]+)?"

これらのコマンドは両方とも出力されmiss rate 0.21ます。数値だけを抽出したい場合は、Perl、Sed、または Awk を使用しないのはなぜですか?

本当にそれらを避けたいのなら、これでうまくいくでしょうか?

grep -E "miss rate [0-9]+(\.[0-9]+)?" g | xargs basename | tail -n 1
于 2013-03-12T20:36:11.653 に答える
0

私は信じている

sed 's|[^0-9]*\([0-9\.]*\)|\1 |g' fiilename

トリックを行います。ただし、問題がなければ、すべてのエントリが独自の行になります。sed がコンマまたはスペースで区切られたリストを生成する方法があると確信していますが、私はすべての sed のスーパー マスターではありません。

于 2013-03-13T00:01:12.803 に答える