如何从awk命令读取值?

如何从awk命令读取值?

我有结果文件,我需要读取“rx cells”的值,报告文件如下所示: 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

还要确保输入文件是 Unix 文本文件而不是 DOS 文本文件。运行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

您还可以使用更 elequant 的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]+)matchrx cells .*\W匹配任何字符,直到非单词字符和 ([0-9]+) 在组中捕获一个或多个数字。
  • \1将输出替换为包含 n 个捕获数字的第一组。

相关内容