首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash中从grep命令中提取特定数据?

如何在bash中从grep命令中提取特定数据?
EN

Stack Overflow用户
提问于 2020-06-03 23:43:27
回答 5查看 809关注 0票数 0

我正在编写自己的脚本,以告诉我是否使用了超过500个MiB的数据。我使用vnstat -d来获取有关数据使用的信息。vnstat -d 输出在这里

产出应是:

  1. 只来自“总栏”
  2. 只有大于500的值。

我只想要“总计”列中的值。我的输出列出了所有列的数据。从以下几个方面更好地说明:

代码语言:javascript
复制
#!/bin/bash
for i in `vnstat -d | grep -a [0-9] `; //get numerical values in i (-a tag as vnstat outputs in binary)
do 
    NUMBER=$(echo $i | grep -o '[5-9][0-9][0-9]'); //store values >500 in a var called NUMBER
    echo $NUMBER;
done;

我是一个自学的新手,所以请不要打我。

我从上面的脚本中接收到的当前输出:

代码语言:javascript
复制
600
654
925
884
923
871
967
868

我想要的输出应该是:

代码语言:javascript
复制
654   
923    
967
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-06-04 00:17:35

简化:

代码语言:javascript
复制
#/bin/bash
if [[ $(( $(vnstat -d --oneline|cut -d';' -f6|cut -d. -f1|paste -sd '+') )) -ge 500 ]];then
  echo 500 Mb reached
fi

(脚本所做的是从每个接口中从类似于oneliner CSV的输出中获取指定的字段,然后裁剪整数并对它们进行求和。然后比较该和是否等于或大于500。如果是的话,then输出一条消息)

注意:

-f6将解析“今日总计”流量。

您可以将其替换为:

-f4 =今天的rx

今天的-f5 = tx

票数 1
EN

Stack Overflow用户

发布于 2020-06-04 02:27:52

您希望解析一个管道分隔的表,并且只检查特定的列,对于此工作,有一些工具比grep更合适,例如,您可以编写一个小型bash脚本,在其中使用cut命令提取并处理数据,或者awk

下面是一个使用awk的解决方案。我们打印该列的编号> 500total。将命令输出发送到

代码语言:javascript
复制
awk -F "|" '($3+0>=500){print $3}'
  • -F将字段分隔符设置为|
  • $3+0用于将以数字开头的字符串转换为该数字,这样我们就可以将其作为数字处理并进行比较。

现在,如果您真的想提取列total > 500 MiB的所有值,那么预期的输出应该包括以GiB表示的所有值,因为它们是> 1000 MiB,例如,邪恶屏幕截图中的最小值是0.98 GiB,即1003 MiB。所以我们可以把它加到第一个条件上。

代码语言:javascript
复制
awk -F "|" '($3 ~ /GiB/ || $3+0>500){print $3}'

现在,如果希望输出仅为MiB中的整数,则可以将其修改为:

代码语言:javascript
复制
awk -F "|" '($3 ~ /GiB/){$3=1024*$3+0} ($3+0>500){printf "%.0f\n",$3}'

在这里,我们将所有GiB值转换为MiB,然后进行比较。

票数 1
EN

Stack Overflow用户

发布于 2020-06-03 23:58:13

代码语言:javascript
复制
#!/bin/bash
IFS=$'\n'
for i in `vnstat -d`; do # get each lines
  VALUE=$(echo $i | cut -d\| -f3) # get total value with unit, in case you want to check for GiB values
  NUMBER=$(echo $VALUE | grep -o '[0-9.*]' | cut -d. -f1); # split the string by '|', get the number part, store the integer part into NUMBER
  if [[ $NUMBER -ge 500 && "$VALUE" == *"MiB"* || "$VALUE" == *"GiB"* ]]; then # if the number is greater than or equals to 500 OR it's in GiB
    echo $VALUE; # echo the value
  fi
done

当然,如果您想要的话,可以去掉GiB检查。

编辑:在开头添加IFS=$'\n‘。这允许for循环使用结束行作为分隔符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62184559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档