如何解决在Bash脚本中操纵假脱机命令输出
我正在使用后台处理程序从bash脚本运行sql查询,并获得以下输出。
#!/bin/bash
/usr/lib/oracle/12.2/client64/bin/sqlplus -s esg/esg << EOF
spool /tmp/test
< SOME SELECT QUERY >
spool off;
EOF
exit;
我得到的输出如下:
cat /tmp/test
TABLESPACE_NAME USED_PCT
------------------------------ ----------
TEMP_TBS1 23
SYSAUX 4
GTEMP 3
SYSTEM 3
UNDOTBS2 0
UNDOTBS1 0
TEMP 0
USERS 0
DATA_TBS1 23
INDEX_TBS1 11
10 rows selected.
我想摆脱除值之外的所有内容,即我不希望标题,“-”,“选择10行”以及当然为空行。看起来像下面的
TEMP_TBS1 23
SYSAUX 4
GTEMP 3
SYSTEM 3
UNDOTBS2 0
UNDOTBS1 0
TEMP 0
USERS 0
DATA_TBS1 23
INDEX_TBS1 11
解决方法
这实际上不是一个shell问题,但是在您的Heredoc中,在后台打印之前,添加一些SQL * Plus格式化命令;例如:
/usr/lib/oracle/12.2/client64/bin/sqlplus -s esg/esg << EOF
set feedback off
set pagesize 0
set trimspool on
spool /tmp/test
...
设置pagesize to zero“禁止所有标题,分页符,标题,初始空白行和其他格式信息”。
设置feedback off会删除所有反馈,例如“已选择10行”。
有set
命令in the documentation的摘要。关于formatting SQL*Plus reports,还有一节。
我建议使用Alex的解决方案-但是,如果您确实希望所有输出都保存在假脱机日志中,并且只想剥离其他位的相关位,请尝试sed
,这将允许分层条件。
$: sed -n '/^---/,/^$/{ /^[A-Z]/p }' test
TEMP_TBS1 23
SYSAUX 4
GTEMP 3
SYSTEM 3
UNDOTBS2 0
UNDOTBS1 0
TEMP 0
USERS 0
DATA_TBS1 23
INDEX_TBS1 11
打破现状:
sed -n
说除非明确订购,否则不要打印任何内容。/^---/,/^$/
说,仅在此范围内的行上执行以下命令。{ ... }
表示在应用先前条件时应用大括号的内容,因此,由于先前条件是范围选择,因此可以在范围的每一行上共同执行多个命令。/^[A-Z]/p
仅在第一个字符为大写字母的情况下显示print。
总而言之,所有这些都表示“对于破折号和空白行之间的线,仅当它们以大写字母开头时才打印”。其他所有内容都会被忽略。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。