作者 主題: awk使用外部變數  (閱讀 15586 次)

0 會員 與 1 訪客 正在閱讀本文。

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 於: 2002-06-21 19:59 »
有人試過如何在awk的'{ }'內用外部shell的變數嗎?
我用Google找到的那篇,一直都有問題?!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
awk使用外部變數
« 回覆 #1 於: 2002-06-21 20:02 »
不如先說說是什麼問題﹖這樣或許大家比較容易建議~~

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #2 於: 2002-06-21 21:49 »
指令行如下

代碼: [選擇]
awk '{ print "mysqldump phpbb2 -u phpbbuser --opt " $1 " > " \
     $1".sql" }' tables_list | /bin/sh


而 tables_list 內容像

代碼: [選擇]
phpbb_auth_access
phpbb_banlist
phpbb_categories
phpbb_config
phpbb_disallow
phpbb_forum_prune
phpbb_forums
phpbb_groups
phpbb_posts
phpbb_posts_text
phpbb_privmsgs
phpbb_privmsgs_text


現在上面那個指令行寫在一個script內,
phpbb2是指一個db name,
phpbbuser 是一個 db username,
假如像上面寫死在一行內,run都沒問題,
但若是在script開頭先宣告,
那要如何帶入awk內?

下面這樣跑是套"$db_name"和"$db_user",
而不是我要的"phpbb2"和"phpbbuser"...
代碼: [選擇]

#!/bin/sh
db_name="phpbb2"
db_user="phpbbuser"

awk '{ print "mysqldump $db_name -u $db_user --opt " $1 " > " \
     $1".sql" }' tables_list | /bin/sh


我希望的結果是
代碼: [選擇]
mysqldump phpbb2 -u phpbbuser --opt phpbb_vote_voters > phpbb_vote_voters.sql
mysqldump phpbb2 -u phpbbuser --opt phpbb_words > phpbb_words.sql

而不是
代碼: [選擇]
mysqldump $db_name -u $db_user --opt phpbb_vote_voters > phpbb_vote_voters.sql
mysqldump $db_name -u $db_user --opt phpbb_words > phpbb_words.sql

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
awk使用外部變數
« 回覆 #3 於: 2002-06-21 22:55 »
這個我也不清楚﹐或許您試試﹕

代碼: [選擇]
awk 'BEGIN { db_name="phpbb2"; db_user="phpbbuser" }
{ print "mysqldump $db_name -u $db_user --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh

jade-rabbit

  • 鑽研的研究生
  • *****
  • 文章數: 833
  • 性別: 男
    • 檢視個人資料
Re: awk使用外部變數
« 回覆 #4 於: 2002-06-22 00:24 »
引述: "duncanlo"
有人試過如何在awk的'{ }'內用外部shell的變數嗎?
我用Google找到的那篇,一直都有問題?!

我記得以前在學 awk 時也遇過同樣的情況,最後找了好多 man(ual)
好像是把該變數用 " " 括起來就可..

另外,剛去 google 找到一篇..
http://www.csie.nctu.edu.tw/document/unixfaq/node37.html
哇!Unix FAQ ?
--(中也者天下之大本也,和也者天下之達道也)--

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #5 於: 2002-06-22 01:28 »
引述: "netman"
這個我也不清楚﹐或許您試試﹕

代碼: [選擇]
awk 'BEGIN { db_name="phpbb2"; db_user="phpbbuser" }
{ print "mysqldump $db_name -u $db_user --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh


還是不行!

BEGIN看手冊說是一開始RUN,只RUN一次!

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
Re: awk使用外部變數
« 回覆 #6 於: 2002-06-22 01:29 »
引述: "JadeRabbit"
引述: "duncanlo"
有人試過如何在awk的'{ }'內用外部shell的變數嗎?
我用Google找到的那篇,一直都有問題?!

我記得以前在學 awk 時也遇過同樣的情況,最後找了好多 man(ual)
好像是把該變數用 " " 括起來就可..

另外,剛去 google 找到一篇..
http://www.csie.nctu.edu.tw/document/unixfaq/node37.html
哇!Unix FAQ ?


3Q! 這篇我盯了3天了,
始終無法體會它的真義!

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #7 於: 2002-06-22 01:31 »
要達到這功能,是不是還有其他不用AWK方法的方法?

我現在已在改試把變數轉成檔案內容來處理看看!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
awk使用外部變數
« 回覆 #8 於: 2002-06-22 01:34 »
引述: "duncanlo"
引述: "netman"
這個我也不清楚﹐或許您試試﹕

代碼: [選擇]
awk 'BEGIN { db_name="phpbb2"; db_user="phpbbuser" }
{ print "mysqldump $db_name -u $db_user --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh


還是不行!

BEGIN看手冊說是一開始RUN,只RUN一次!


抱歉﹐因為我也是靠猜的~~  ^_^

雖然說是 run once ﹐但定義 variable 的話﹐的確是 run 一次就夠了。

或許如 jaderabbit 兄所言﹐注意 hard quote 和 soft quote 對特殊符號的不同處理吧﹖

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #9 於: 2002-06-22 01:40 »
引述: "netman"
雖然說是 run once ﹐但定義 variable 的話﹐的確是 run 一次就夠了。
或許如 jaderabbit 兄所言﹐注意 hard quote 和 soft quote 對特殊符號的不同處理吧﹖


應該也是,一定有地方的變數帶錯方法!
script最好是一個檔解決,不要多用一些tmp檔去完成是最好了!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
awk使用外部變數
« 回覆 #10 於: 2002-06-22 01:43 »
引述: "duncanlo"
要達到這功能,是不是還有其他不用AWK方法的方法?

我現在已在改試把變數轉成檔案內容來處理看看!


用 echo 不行嗎﹖

#!/bin/sh
db_name="phpbb2"
db_user="phpbbuser"
tables_list="table.file"

代碼: [選擇]

for i in $(awk '{print $1}' $table_list)
do
    echo "mysqldump $db_name -u $db_user --opt $i >  $i.sql"
done

  • 實習板主
  • 活潑的大學生
  • ***
  • 文章數: 270
    • 檢視個人資料
awk使用外部變數
« 回覆 #11 於: 2002-06-22 01:53 »
duncanlo兄,試試這個

awk '{ print "mysqldump " the_name " -u"  the_user " --opt " $1 " > " \
     $1".sql" }' the_name="$db_name" the_user="$db_user" tables_list \
 | /bin/sh

將上層變數傳進awk的內部變數中

  • 實習板主
  • 活潑的大學生
  • ***
  • 文章數: 270
    • 檢視個人資料
awk使用外部變數
« 回覆 #12 於: 2002-06-22 02:16 »
引述: "netman"
這個我也不清楚﹐或許您試試﹕

代碼: [選擇]
awk 'BEGIN { db_name="phpbb2"; db_user="phpbbuser" }
{ print "mysqldump $db_name -u $db_user --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh


這樣應該也可以
awk '{ $db_name="phpbb2"; $db_user="phpbbuser" ;print "mysqldump "$db_name" -u "$db_user" --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh

不過這變數與awk外部變數無關說

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #13 於: 2002-06-22 02:28 »
引述: "netman"
用 echo 不行嗎﹖

#!/bin/sh
db_name="phpbb2"
db_user="phpbbuser"
tables_list="table.file"

代碼: [選擇]

for i in $(awk '{print $1}' $table_list)
do
    echo "mysqldump $db_name -u $db_user --opt $i >  $i.sql"
done


這個可以,不過只是畫面輸出,
只要再轉成一個檔去RUN即可!

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #14 於: 2002-06-22 02:30 »
引述: "任俠"
duncanlo兄,試試這個

awk '{ print "mysqldump " the_name " -u"  the_user " --opt " $1 " > " \
     $1".sql" }' the_name="$db_name" the_user="$db_user" tables_list \
 | /bin/sh

將上層變數傳進awk的內部變數中


這個就是我想要的! 3Q 3Q 3Q
原來重點是變數的宣告要放在awk{}和input-file之間才行?!  :lol:

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
awk使用外部變數
« 回覆 #15 於: 2002-06-22 02:32 »
引述: "任俠"
這樣應該也可以
awk 'BEGIN { $db_name="phpbb2"; $db_user="phpbbuser" }
{ print "mysqldump "$db_name" -u "$db_user" --opt " $1 " > "
     $1".sql" }' tables_list | /bin/sh


這個很奇怪,
$db_name,$db_user變數都是抓到$1的值...

jade-rabbit

  • 鑽研的研究生
  • *****
  • 文章數: 833
  • 性別: 男
    • 檢視個人資料
Re: awk使用外部變數
« 回覆 #16 於: 2002-06-22 02:53 »
引述: "duncanlo"

3Q! 這篇我盯了3天了,
始終無法體會它的真義!


該文說了三種方法,我喜歡用 1st or 3rd..
至於 2nd 嘛,不容易瞭解,不予採用哈哈..
且文中說 2nd 在有些系統下是不能依賴的.

這使我想起以前耶誕節有ㄍ學弟寄給我一個 .c 檔可以發出聖誕音樂,
但是看不懂在寫啥,有人收過嘛?

還有一題,用 C 寫個程式,可以印出自己程式碼,
但是不是 open 開檔喔。這個程式碼就可以理解。
--(中也者天下之大本也,和也者天下之達道也)--

  • 實習板主
  • 活潑的大學生
  • ***
  • 文章數: 270
    • 檢視個人資料
awk使用外部變數
« 回覆 #17 於: 2002-06-22 03:07 »
引述: "duncanlo"
引述: "netman"
用 echo 不行嗎﹖

#!/bin/sh
db_name="phpbb2"
db_user="phpbbuser"
tables_list="table.file"

代碼: [選擇]

for i in $(awk '{print $1}' $table_list)
do
    echo "mysqldump $db_name -u $db_user --opt $i >  $i.sql"
done


這個可以,不過只是畫面輸出,
只要再轉成一個檔去RUN即可!


for i in $(awk '{print $1}' $table_list)
do
    eval "mysqldump $db_name -u $db_user --opt $i >  $i.sql"
done

用eval這樣才會執行

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
Re: awk使用外部變數
« 回覆 #18 於: 2002-06-22 14:21 »
引述: "JadeRabbit"
該文說了三種方法,我喜歡用 1st or 3rd..
至於 2nd 嘛,不容易瞭解,不予採用哈哈..
且文中說 2nd 在有些系統下是不能依賴的.

這使我想起以前耶誕節有ㄍ學弟寄給我一個 .c 檔可以發出聖誕音樂,
但是看不懂在寫啥,有人收過嘛?

3Q!
大俠教的方法應該是像(3)那個,
但要在input-file之前宣告才行!

我同學曾給我一個C的Code,
可以在dos,linux下測試開目錄和檔案數之極限值,
結果我自己不知改到什麼,那程式變成蟲蟲產生器,
會把每個目錄內塞滿隱藏檔...