[英]Manipulate spool command output in Bash Scripting
我正在使用 spool 從 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 中,在 spool 之前,添加一些 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設置為零“抑制 [es] 所有標題、分頁符、標題、初始空行和其他格式信息”。
設置反饋關閉會刪除所有反饋,如“選擇 10 行”。
文檔中有set
命令的摘要。 還有一個關於格式化 SQL*Plus 報告的部分。
我建議使用 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
表示除非明確訂購,否則不要打印任何內容。
/^---/,/^$/
表示僅在此范圍內的行上執行以下命令。
{ ... }
表示在前一個條件適用時應用大括號的內容,因此由於前一個條件是范圍選擇,這允許在范圍內的每一行上共同執行多個命令。
/^[AZ]/p
表示僅當第一個字符是大寫字母時才打印。
總的來說,所有這些都表示“對於破折號和空行之間的行,當且僅當它們以大寫字母開頭時才打印”。 其他一切都將被忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.