結果ファイルがあり、「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テキストファイルであることを確認してください。このファイルを実行してdos2unix
Unixテキストファイルに変換します。
コマンドを確認してください。
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個のキャプチャされた番号を含む最初のグループに置き換えます。