2017-03-21 14 views
0

サーバーコンソールで/listを使用して、オンラインプレーヤー用のミニクラフトサーバーを確認したいと思います。これは私に以下の入力を与える。目標は、プレーヤーが特定のリストにあるかどうかを比較することです。彼がいないならば、私たちは彼を蹴る。 output.logには、許可されたプレーヤー(各1行)が記載されています。bashでawkを使用して入力をフィルタリングする

mc() 
{ 
    screen -S mcserver -p 0 -X stuff "$1^M" 
} 

    if ! grep -q $player output.log; then 
    echo "$player do not runs launcher." 
    mc "kick $player" 

我々は、オンラインのプレイヤーを取得すると、許可リストにあるかどうかをチェックすることができますプレーヤーのために、以下の入力をフィルタリングしたいと思います:

[18:43:08] [pool-2-thread-528/INFO]: There are 2/100 players online. 
[18:43:08] [pool-2-thread-528/INFO]: Tester1212, Me99666 

背後にある考え方は、入力をフィルタリングすることですawkを使って、,などを見て見つけてください。

最終的な出力は、(1行としてそれぞれ)でなければなりません:

Tester1212 
Me99666 

のみ1プレイヤーがオンラインで、何,がない場合、問題はそれをフィルタリングすることができます。

+0

あなたは、この特定の行があるべきものであると他にどのように識別します解析?それは常に出力の2番目の行ですか? 「N/N選手がオンライン」という行の後に常に表示されますか? – JNevill

+1

私はこの質問を閉じるのに投票しました。なぜなら、あなた自身のコードを使って援助を求めるのではなく、ツールやソリューションのための勧告の要求であると思われるからです。これはあなたの質問をStackOverflowのトピックから外します。その評価が間違っていて、本当にあなた自身のコードを書くのを助けたいのであれば、[今までのところあなたの仕事をあなたの質問に追加してください](http://stackoverflow.com/posts/35433718/edit)閉じる投票。 – ghoti

+0

はい、プレイヤーは「オンライン/ N/Nプレーヤーがオンラインです」の後に常に直接リストされます。 –

答えて

2

はこれを試してみてください -

awk -F'[, ]' '/players online/ {getline; print $3RS$5}' f 
Tester1212 
Me99666 

OR

awk -F'[, ]' '/players online/ {getline; print $3,$5}' f 
Tester1212 Me99666 
0

これがミニクラフトサーバー上の/listからのものである場合、後にあるレコードは常に第2のものになります。これはここで役立ちます。

あなたはそうのような行を解析するためのawkを使用することができます。

<your command> | awk -F": " 'NR==2{split($2,a,", "); for(x in a) print a[x]}' 

これは以下となります。私たちは二行目にある場合

  1. はコロンとスペース-F": "
  2. でレコードを分割しました/レコードNR==2
  3. 次に、2番目のフィールド(名前のリスト)をカンマとスペースで区切り、配列 "a"に格納します。split($2,a,", ")
  4. は最終的に各要素に「X」を割り当て、配列を反復処理し、要素を印刷:for(x in a) print a[x]

ありawkでこれを行うために、よりエレガントな方法は、おそらくですが、これは良いスタートであり、それはあなたのための解決サーバー上に1人のユーザーしかいないときの問題。

+0

私はそれをできるだけお試しください。ウルの助けのためのThx。 (昼食を取る:P) –

0

あなたはこのようawkを使用することができます。

awk -F ']: ' '/players online/{getline; gsub(/, */, ORS, $2); print $2}' output.log 

Tester1212 
Me99666 
関連する問題