2

まったく新しいLinuxユーザーとして、私は(実際に)sedawk(またはその他の)ツールを使用してテキストを解析したことはありません。から抽出したい

速度:9.410000秒で1624.127424 Kib / s

seconds単語の直前の秒単位の時間値、

これについてどのツールを調べる必要がありますか?

4

5 に答える 5

6

使用できるツールはたくさんありますが、awk問題なく動作します。

echo "Speed : 1624.127424 Kib/s in 9.410000 seconds" | awk '{print $6}'

または(データがファイルにある場合):

awk '{print $6}' data.txt

あなたにあげる

9.410000

説明

これは、ライン上で関心のある値の相対位置が同じままである(この場合は6番目の空白で区切られたフィールドである)ことを前提としており、それに応じて調整します。

awk入力行を空白に基づいてフィールドに分割します。関心のあるフィールドは6番目のフィールドなので、を使用して印刷してい$6ます。

または、行の最後から2番目のフィールド(特定の行のフィールド数を知っているawk変数)awk '{print $(NF-1)}'を印刷するために使用することもできます。NFこれにより、関心のあるフィールドが最後から2番目である限り、長さの行(つまりフィールドの数)で機能するため、もう少し柔軟性があります。

-

cutも機能する別のツールになります:

echo "Speed : 1624.127424 Kib/s in 9.410000 seconds" | cut -d' ' -f 6

この場合、行はスペースの区切り文字(で指定)に基づいて分割されます。-dここでも、6番目のフィールド(-f 6)に関心があります。

他の方法もありますが、これら2つは単純に見え、最初に頭に浮かびました。

于 2012-09-09T20:00:41.237 に答える
3

または、文字列のどこにあるか正確にはわからないが、「秒」という単語の前にあることがわかっている場合は、を使用できますsed。これは正規表現に入ります。これはフィールドを数えるほど単純ではありませんが、厳密に制約された形式ではない可能性のある文字列からデータを取得できます。これが1つの方法<<<です(コマンドへの入力として文字列をフィードするもう1つの方法です):

sed -n 's/^.* \([0-9.]\+\) seconds.*$/\1/p'  <<<"Speed : 1624.127424 Kib/s in 9.410000 seconds" 

入力は1行しかないため、ここでは-n/pは無関係ですが、便利なパターンを形成sedします。デフォルトではすべての行を出力せず、検索と置換が成功した行のみを出力するように指示します。

構文は検索と置換を実行します。s/old/new/ここで、「古い」部分は正規表現パターンです。

パターン[0-9.]\+ secondsは、1つ以上の数字またはピリオドの後にスペースと「秒」という単語が続くものと一致します。パターンの一部をバックスラッシュかっこで囲むと、パターンのその部分に一致する実際の文字列が後で使用できるように変数に保存されます。したがって\([0-9.]\+\) seconds、必要な数をキャプチャします。

その値だけを出力したいので^.*、「行の先頭からすべてに一致する」と「.*$行の終わりまでのすべてに一致する」の間に値を置きます。そうすれば、行全体が置き換えられます。ただし、.*貪欲なので、パターンの前に置くと、数字の最後の桁を除いて、不要なものがすべて噛み砕かれます。パターンの番号の前にスペースを追加すると、それを防ぐことができます。

線を何に置き換えますか?、\1は、バックスラッシュ括弧(の最初のペア)の間のパターンの部分に一致する文字列です。

追加するために編集:

Perlは質問にリストされていませんが、上記のsedアプローチと同様の方法は次のようになります。

perl -lne 'print $1 if /([0-9.]+) seconds/'  <<<"Speed : 1624.127424 Kib/s in 9.410000 seconds" 
于 2012-09-09T20:35:23.453 に答える
2

変数に単一の文字列がある場合は、シェル自体を使用できます。それが6番目のフィールドであることがわかっている場合(@Levonのawkソリューションが想定しているように)、これを行うことができます。

set -- $variable
seconds=$6

または、単語の後に単語が続くことがわかっている場合は、seconds文字列置換を使用できます。

prefix=${variable%\ seconds*}
seconds=${prefix##*\ }

(一時変数には、スペースの後に何かが含まれ、「秒」がトリミングされたオリジナルが含まれます。同様に、最初から最後のスペースまですべてがトリミングされます。)

シェルを過小評価しないでください。時々風変わりですが、非常に用途が広いです。

于 2012-09-09T20:10:07.403 に答える
2

完了のために、perlはawkのようなモードで動作できます。あなたのデータが入っていると仮定すると、まあdata.txt

$ perl -lane 'print $F[5] data.txt'
9.410000

-a自動分割モードをオンにします– perlは、空白の入力行を@F配列に自動的に分割します。

于 2012-09-10T09:48:32.123 に答える
1

また、cut

echo "Speed : 1624.127424 Kib/s in 9.410000 seconds" | cut -f 6 -d' '

ドキュメント(抜粋):

cut-ファイルの各行からセクションを削除します

-d, --delimiter=DELIM

フィールド区切り文字DELIMの代わりに使用TAB

-f, --fields=LIST

これらのフィールドのみを選択してください。-sオプションが指定されていない限り、区切り文字を含まない行も印刷します

于 2012-09-09T20:01:34.893 に答える