2015-12-15 23 views
0

我想創建一個bash腳本,它只執行INSERT行的pg_dump並更改INSERT行中的表格標題。僅使用INSERT行過濾pg_dump並使用awk更改表名

我有以下bash腳本:

#!bin/bash 

#Create temp files to store the PSQL dump 
DUMPFILE='poops.dump.sql' || (echo "make sql dump file failed" 1>&2; exit 1) 
TMPFILE=`mktemp` || (echo "mktemp failed" 1>&2; exit 1) 

#Tables to dump: api_order, poops_order_dates, poops_price 
#Dump as INSERT queries statements 
pg_dump --username="poops" --host="localhost" \ 
--table="api_order" --table="poops_order_dates" --table="poops_price" \ 
--no-password --column-inserts \ 
--data-only "poops" | \ 
awk '/^INSERT/ {i=1} {if(i) print}' \ 
> "$TMPFILE" \ 
|| (echo "pg_dump failed" 1>&2; exit 1) 

(echo "start transaction; truncate table api_order; "; \ 
echo "truncate table poops_order_dates; "; \ 
echo "truncate table poops_price; "; \ 
cat "$TMPFILE"; echo 'commit;') \ 
> "$DUMPFILE" \ 
|| (echo "parsing dump file failed" 1>&2; exit 1) 

rm "$TMPFILE" 

它消除了所有的垃圾第一INSERT INTO前行,但仍有以下的東西全部插入後INTO查詢:

-- 
-- Name: api_order_id_seq; Type: SEQUENCE SET; Schema: public; Owner: poops 
-- 

SELECT pg_catalog.setval('api_order_id_seq', 33146, true); 


-- 
-- Data for Name: poops_order_dates; Type: TABLE DATA; Schema: public; Owner: poops 
-- 



-- 
-- Name: poops_order_dates_id_seq; Type: SEQUENCE SET; Schema: public; Owner: poops 
-- 

SELECT pg_catalog.setval('poops_order_dates_id_seq', 1, false); 


-- 
-- Data for Name: poops_price; Type: TABLE DATA; Schema: public; Owner: poops 
-- 



-- 
-- Name: poops_price_id_seq; Type: SEQUENCE SET; Schema: public; Owner: poops 
-- 

SELECT pg_catalog.setval('poops_price_id_seq', 1, false); 


-- 
-- PostgreSQL database dump complete 
-- 

如何編寫下列awk行:

awk '/^INSERT/ {i=1} {if(i) print}' \ 

爲了讓它啓動輸出INSERT INTO查詢,並將api_order更改爲api_order_test。

我曾嘗試:

awk '/^INSERT/ {gsub("INSERT INTO api_order", "INSERT INTO api_order_test", $0); print $0}' \ 

但由於打印$ 0,它在那裏它開始在新的一行切斷查詢的一部分。我需要它來過濾,輸出和僅更改

"INSERT INTO api_order ....);\r" 

我相信在它到底是一個回車(\ r),還是不告訴pg_dump輸出的每個INSERT INTO查詢,並在最後一個\ n嗎?

原始SQL轉儲:

-- 
-- PostgreSQL database dump 
-- 

SET statement_timeout = 0; 
SET lock_timeout = 0; 

-- 
-- Data for Name: api_order; Type: TABLE DATA; Schema: public; Owner: poops 
-- 

INSERT INTO api_order (id, order type, …'', 0, NULL); 
INSERT INTO api_order (id, order type, …'', 0, NULL); 
INSERT INTO api_order (id, order type, …'', 0, NULL); 
INSERT INTO api_order (id, order type, …'', 0, NULL); 
INSERT INTO api_order (id, order type, …'', 0, NULL); 


-- 
-- Name: api_order_id_seq; Type: SEQUENCE SET; Schema: public; Owner: poops 
-- 

SELECT pg_catalog.setval('api_order_id_seq', 33294, true); 

-- 
-- Data for Name: hoops_price; Type: TABLE DATA; Schema: public; Owner: poops 
-- 

-- 
-- Name: hoops_price_id_seq; Type: SEQUENCE SET; Schema: public; Owner: poops 
-- 

SELECT pg_catalog.setval('hoops_price_id_seq', 1, false); 

-- 
-- PostgreSQL database dump complete 
-- 
+0

如果您不想打印的所有內容都出現在您想打印的所有內容之後,您可以像打開打印一樣關閉打印機。就像'/^INSERT/{i = 1}/^ SELECT/{i = 0} i'。 (請注意,後面的'i'等同於您的'{if(i)print}')如果您輸入的內容比較複雜或者還有其他注意事項,請將輸入的代表性樣本發佈到awk以及您的預期輸出。 – jas

+0

它可以幫助,如果我們可以看到原始來源(在你的awk之前)和期望的最終輸出(不需要1000條線,只有代表) – NeronLeVelu

+0

謝謝Jas幫助。只有select語句必須被刪除才能使其正常工作。評論不需要被觸及。 – ramabrahma

回答

0

如果一切你不'不想打印你想打印後一切來臨的時候,你可以在"您打開它以同樣的方式關閉"打印。類似於/^INSERT/ {i=1} /^SELECT/ {i=0} i。 (請注意,尾部i相當於您的{ if (i) print })如果您的'重新輸入更復雜或者有其他考慮事項,請將輸入的代表性樣本張貼到awk和您的預期輸出。 –   jas