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
--
如果您不想打印的所有內容都出現在您想打印的所有內容之後,您可以像打開打印一樣關閉打印機。就像'/^INSERT/{i = 1}/^ SELECT/{i = 0} i'。 (請注意,後面的'i'等同於您的'{if(i)print}')如果您輸入的內容比較複雜或者還有其他注意事項,請將輸入的代表性樣本發佈到awk以及您的預期輸出。 – jas
它可以幫助,如果我們可以看到原始來源(在你的awk之前)和期望的最終輸出(不需要1000條線,只有代表) – NeronLeVelu
謝謝Jas幫助。只有select語句必須被刪除才能使其正常工作。評論不需要被觸及。 – ramabrahma