awkコマンドから値を読み取るには?

awkコマンドから値を読み取るには?

結果ファイルがあり、「rxセル」の値を読み取る必要があります。レポートファイルは次のとおりです。 test.log ファイルの内容は次のとおりです。

    co_result=test.log  

    ZyXEL IES-1000> statistics port 12 0 33
    [adsl channel 12-0/33]
    tx packets: 56
    rx packets: 60
    tx rate   : 0
    rx rate   : 0
    tx cells  : 468
    rx cells  : 1707
    errors    : 0
    ZyXEL IES-1000>

rx セル値を読み取るには、次のコマンドを使用します。

    cells=$(grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1')
    echo "Var_value: $cells"

ただし、ファイルから上記の2つのコマンドを実行しようとすると問題が発生します。 echoの最初の数文字が表示されない次の出力を取得します。

       1707value: 530  

$cells変数には1707しかないと予想しましたが、エラーが印刷されました。問題を理解していません。問題を解決するのに役立ちますか?

答え1

コマンドの置換は不必要に複雑です。

代わりに:

cells=$( awk '/rx cells/ { print $NF }' <"$co_result" )
printf 'Var_value: %s\n' "$cells"

$NF行に文字列が含まれている場合に印刷される行の最後のスペースで区切られたフィールドrx cells

また、入力ファイルがDOSテキストファイルではなくUnixテキストファイルであることを確認してください。このファイルを実行してdos2unixUnixテキストファイルに変換します。


コマンドを確認してください。

grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1'

まず、スペース、タブ、改行文字、その他の特殊文字(引用符で囲まれていないため)が含まれているとgrep -e 'cells' $co_result失敗します。$co_result

コマンド出力

tx cells  : 468
rx cells  : 1707

それから: cut -d: -f2。この出力

 468
 1707

それから: awk '{print $1}'。出力は上記と同じですが、初期スペースは削除されました。

それから: awk 'NR%2{printf $0"";next;}1'。これは混乱したアプローチpaste -d' ' - -と結果です。

468 1707

後者はecho出力されます

Var_value: 468 1707

この情報を取得できない理由は、入力ファイルがDOSテキストファイルであり、各行の末尾にキャリッジリターンが含まれているためです。したがって、カーソルは印刷後に行の先頭に戻ります468

dos2unix入力ファイルに使用してください。

どこから来たのか530わかりません。

答え2

以下を簡単に使用できますgrep

 cells=$(grep -F "rx cells" "$co_result" | grep -oE "[0-9]+")

これにより、次のように数値が変数として抽出されます。

grep -F "rx cells" $co_result:以下を含む行を抽出しますrx cells : 1707
grep -oE "[0-9]+"。数値のみ一致する正規表現の一致のみ出力: 1707

次のように、より洗練されたsedグループ置換を使用して値を抽出することもできます。

cells=$(sed  -r -n 's/rx cells.*\W([0-9]+)/\1/p' "$co_result")
  • -r: 拡張正規表現の有効化
  • -n: 特定の行のみを印刷
  • 's///p': s は置換を意味し、 p はパターンに一致する行を明示的に印刷します。
  • rx cells.*\W([0-9]+)match は、rx cells .*\W単語以外の文字まですべての文字と一致し、([0-9]+)、グループ内の 1 つ以上の数字をキャプチャします。
  • \1出力をn個のキャプチャされた番号を含む最初のグループに置き換えます。

関連情報