酷!學園

技術討論區 => 程式討論版 => 主題作者是: duncanlo 於 2002-06-21 19:59

主題: awk使用外部變數
作者: duncanlo2002-06-21 19:59
有人試過如何在awk的'{ }'內用外部shell的變數嗎?
我用Google找到的那篇,一直都有問題?!
主題: awk使用外部變數
作者: netman2002-06-21 20:02
不如先說說是什麼問題﹖這樣或許大家比較容易建議~~
主題: awk使用外部變數
作者: duncanlo2002-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
主題: awk使用外部變數
作者: netman2002-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
主題: Re: awk使用外部變數
作者: jade-rabbit2002-06-22 00:24
引述: "duncanlo"
有人試過如何在awk的'{ }'內用外部shell的變數嗎?
我用Google找到的那篇,一直都有問題?!

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

另外,剛去 google 找到一篇..
http://www.csie.nctu.edu.tw/document/unixfaq/node37.html
哇!Unix FAQ ?
主題: awk使用外部變數
作者: duncanlo2002-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一次!
主題: Re: awk使用外部變數
作者: duncanlo2002-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天了,
始終無法體會它的真義!
主題: awk使用外部變數
作者: duncanlo2002-06-22 01:31
要達到這功能,是不是還有其他不用AWK方法的方法?

我現在已在改試把變數轉成檔案內容來處理看看!
主題: awk使用外部變數
作者: netman2002-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 對特殊符號的不同處理吧﹖
主題: awk使用外部變數
作者: duncanlo2002-06-22 01:40
引述: "netman"
雖然說是 run once ﹐但定義 variable 的話﹐的確是 run 一次就夠了。
或許如 jaderabbit 兄所言﹐注意 hard quote 和 soft quote 對特殊符號的不同處理吧﹖


應該也是,一定有地方的變數帶錯方法!
script最好是一個檔解決,不要多用一些tmp檔去完成是最好了!
主題: awk使用外部變數
作者: netman2002-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
主題: awk使用外部變數
作者: 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的內部變數中
主題: awk使用外部變數
作者: 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外部變數無關說
主題: awk使用外部變數
作者: duncanlo2002-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即可!
主題: awk使用外部變數
作者: duncanlo2002-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:
主題: awk使用外部變數
作者: duncanlo2002-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的值...
主題: Re: awk使用外部變數
作者: jade-rabbit2002-06-22 02:53
引述: "duncanlo"

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


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

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

還有一題,用 C 寫個程式,可以印出自己程式碼,
但是不是 open 開檔喔。這個程式碼就可以理解。
主題: awk使用外部變數
作者: 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這樣才會執行
主題: Re: awk使用外部變數
作者: duncanlo2002-06-22 14:21
引述: "JadeRabbit"
該文說了三種方法,我喜歡用 1st or 3rd..
至於 2nd 嘛,不容易瞭解,不予採用哈哈..
且文中說 2nd 在有些系統下是不能依賴的.

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

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

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