代わりにawkを使用できますか?


17

これからrating出力として番号を取得したい

# nc localhost 9571 
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94

このようにできます

# nc localhost 9571 | grep rating | cut -d: -f2
94

しかしawk、より単純なソリューションの代わりに使用できますか?


この質問はAwkインターフェースでのプログラミングに関するものであり、StackOverflow.comでより関連性が高いため、トピックから外れているようです。
マゼラン

回答:


32
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'

7
フィールドの値または名前のいずれかに文字列「rating」が含まれている場合、つまりセッション名の1つに「rating」という単語が含まれている場合、誤った結果を与える可能性があります。良い:awk -F: '$1 == "rating" {print $2}'
イングマールハップ

3
それともawk -F: '/^rating:/ { print $2 }'
CVn

私はそれを知っていますが、私はOPのコマンドに基づいて変換します。
クォンタ

@IngmarHupp私はまったく同じことを考えました。実際、問題の正確なレコードと一致する方がはるかに優れているため、この変更で回答を編集しました。これは、人々がawkをより効果的に使用することを学ぶのに役立つことを願っています。
ダンモールディング

14

クアンタは私にそれを打ち負かしましたが、sedあなたがそのように傾いているなら、私はバリアントを含めます

nc localhost 9571 | sed -ne 's/^rating://p'

ただし、MadHatterが言ったことは同じです。現在のソリューションは完全に健全です。(ただし"^rating:"、必要な行のみを取得するために、単語だけでなくgrep を使用します。)


大好きsed!それはあまり利用されておらず、過小評価されています...-
Mei

9

シェルを使用することもできます:

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done

これは最も簡単な方法であり、それ以上のプロセスが発生するのを防ぎますnc。いいね!
メイ

7

はい、(2)grepおよびcutの代わりに(1)awkを使用できます(また、使用する必要があります)。

$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'

lineいバグを避けるために、できる限りあなたの行に合わせてください。

  • /rating/ 作品、
  • /^rating/ より良い(より安全)、
  • /^rating:/ 最適です(この場合)。

4

できる:

nc localhost 9571  | awk -F: '{ if ($1 == "rating") print $2 }' 

(上記のlocalhostで何をしているのかわからないので、出力をawkコマンドへの入力として使用し、「cat」を「nc ...」に置き換えましたが、問題ないはずです。)

しかし、なぜこれを行うのでしょうか? UNIXの方法は、大きな多機能ツールを使用するのではなく、パイプラインを介してそれぞれがうまく機能する多数の小さなツールを使用することです。一致する単一の行を選択し、そこから1つのフィールドを選択する必要があります。一致する行grepcut選択し、入力行からフィールドを選択します。彼らはタスクに最適です。しかし、本当にawkを使ってオールインワンでやりたいのであれば、そこに行きます。


1つの理由は、2つのプロセスを使用grepしてcut生成する必要があり、使用するawk(またはsed)必要なプロセスは1つだけだからです。プロセスの生成には計算コストがかかります。また、perlor rubysedなど)の使用とは異なり、前もってawkはるかに軽量です。
メイ

2
(F15)システムのawkバイナリのサイズは360948バイトで、grepとcutのバイナリは一緒に170824であることに注意してください。1つのfork + execだけでより少ないサイクル、より多くのメモリ、より多くのIOディスクからバイナリを取得します。正直なところ、これらの考慮事項のどれもが現代のシステムでは重要ではないことを疑いますが、もしあなたが最小化することを気にしているなら、そこに行きます!
MadHatterは、

Foo Bah:編集の提案に感謝しますが、Quantaは私の提案よりも後の投稿を行い、提案よりも合理化されています。エントリーレベルのawkユーザーがどのように動作するかを確認する方が簡単で、編集が拒否されるため、私は私の方が好きです。しかし、考えてくれてありがとう!
MadHatterは、

3

Quantaの答えは最も簡単で、私も書きますが、GNU awk(gawk)がネットワーキングを行えることを知らなかったと思いますか?本当に必要な場合は、awkですべてを書くことができます。

BEGIN {
    FS = ":"
    f = "/inet/tcp/0/127.0.0.1/9571"
    while ((f |& getline) > 0)
        if ($1 ~ /^rating$/) {print $2}
}

これは、サーバーにncがインストールされていない場合、ncに権限が制限されている場合、またはawkが本当に好きな場合に便利です。


おー いいね ネットワーキングコプロセッシングの例。
エドワードモルビウス博士

0

sedを使用することもできますが、

nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"

これにより、「評価」が行を開始し、数字が続くことを確認します rating:


0

Perlがオプションの場合:

nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'

-aautosplitsに各ライン@Fアレイの
-F:使用:の代わりに空白のデフォルトのフィールドセパレータとして、
/rating/真戻る正規表現が見つかった場合は、
$F[1]の第2要素である@Fアレイ。
Perl配列は要素0で始まりますが、awkは$ 1で始まります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.