我尝试通过此命令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
并尝试解析获取数据?我怎么做呢?
答案 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)