怎么"读"教学无争议地运作?

时间:2017-01-19 15:13:13

标签: bash shell

我尝试通过此命令doveadm -f tab quota get -u test@example.com获取dovecot邮箱大小,这给了我这个表:

Quota name  Type    Value   Limit   %
User quota  STORAGE 627367  104857600   0
User quota  MESSAGE 3217    -   0

我需要提取627367值。所以我尝试使用标准方法:

$ doveadm -f tab quota get -u test@example.com | while read 
> do 
>     COL3=`awk '{print $3}'`
>     COL4=`awk '{print $4}'`
> done

COL3和COL4应该给我价值和价值的描述。我需要找出" COL3 ==' STORAGE'"如果是,请回显COL4。后来我发现没有变量的while read给了我没有标题的数据:

$ doveadm -f tab quota get -u test@example.com | while read 
> do 
>         cat
> done

User quota  STORAGE 627367  104857600   0
User quota  MESSAGE 3217    -   0

我发现它很有趣,因为我不需要识别标题,我可以分析有用的数据。但这似乎并不容易。如果我插入echo,它会告诉我while运行三次:

$ doveadm -f tab quota get -u test@example.com | while read 
> do 
>         echo "Test"
> done

Test
Test
Test

awk while运行两次:

$ doveadm -f tab quota get -u test@example.com | while read 
> do 
>         awk '{print $3}'
> done

STORAGE
MESSAGE

但是当我开始解析结果时,我发现while只运行一次:

$ doveadm -f tab quota get -u test@example.com | while read 
> do 
>         COL3=`awk '{print $3}'`
>         echo $COL3
> done

STORAGE MESSAGE

所以当我尝试使用

if [ "$COL3" == "STORAGE" ]
then
    echo "Test"
fi

它永远不会奏效。我试着和" MESSAGE"进行比较。甚至使用"存储消息"。它不起作用。

我没有找到任何read没有任何论据的信息。我想问一下,我是否使用标准方法并解析包括标题在内的所有行,或者我可以使用不带参数的read并尝试解析获取数据?我怎么做呢?

2 个答案:

答案 0 :(得分:1)

要回答您的具体问题,

doveadm -f tab quota get -u test@example.com | awk -- '/STORAGE/ { print $4 }'

awk模式/STORAGE/选择包含STORAGE的行,然后print打印您想要的数字。

read而言,请参阅the bash-hackers wiki。不带参数的read会将整行放入$REPLY,因此您不应该访问标准输入。在awk循环中使用read意味着read无法查看每一行,因为read占据行,awk也占据行。

答案 1 :(得分:1)

如@cxw所指出,while没有参数会将整行放入$REPLY

所以你应该写

while read
do
  echo "$REPLY" | awk '/STORAGE/ { print $4 }'
done < <(doveadm -f tab quota get -u test@example.com)