2011-08-17 146 views
5

我现在想从一个SQL命令responde提取值Shell脚本和SQL结果

服用点是这样的:

psql db -c "SELECT COUNT(test) FROM tbTest;" 

结果是:

count 
------ 
33176 
(1 row) 

我想提取33176的价值......有没有简单的方法来做到这一点?

回答

2

如果它总是在格式返回(预期结果第3行),您可以使用此:

psql db -c "SELECT COUNT(test) FROM tbTest;" | tail -n 2 | head -n 1 

的解释:

tail -n 2将得到最后2行,然后通过head -n 1处理,即获得前1行。

+0

外观极好答案:d – Killercode

+4

AH提供了更优雅的方案。 –

1

编辑:实际上,这不起作用,对不起。但波纹管工作。

如果结果为总是4行,并且在不调用该创建过程的任何其他命令:

(read; read; read count; read) < <(psql db -c "SELECT COUNT(test) FROM tbTest;") 
echo "$count" 

这也工作:

结束编辑

psql db -c "SELECT COUNT(test) FROM tbTest;" | (read; read; read count; read; echo "$count") 

警告:count变量将不可用于括号外因为管道(|)启动了一个新过程。所以这不起作用:

psql db -c "SELECT COUNT(test) FROM tbTest;" | (read; read; read count; read) 
echo "$count" 

编辑:

如果你想在一个变盘点,您可以:

count=$(psql db -c "SELECT COUNT(test) FROM tbTest;" | (read; read; read count_tmp; read; echo "$count_tmp")) 
1

如果你能接受启动一个进程,但不两个(头和尾),你可以:

psql db -c "SELECT COUNT(test) FROM tbTest;" | sed -n -e '3p' 

这总是假设输出的psql将4行,你需要第三个。

17

为什么使用不需要的东西?只需使用一些psql选项...

> psql -At -c "SELECT COUNT(test) FROM tbTest;" db 
115899 
+0

简化为:psql db -Atc'SELECT count(test)FROM tbtest' –

+1

+1。如果你想选择多个列,这是特别有用的,因为它删除了空格。 – ojrac

3

通过封闭在反引号完整的shell命令,可以检索其结果到一个shell变量:

#/bin/sh 

THECOUNT=`psql -A -t -c 'SELECT COUNT(*) FROM tbTest;' db` 
echo "the count = $THECOUNT"