我有结果文件,我需要读取“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 个捕获数字的第一组。