第二章 簡介
第三章 讀取輸入檔案
第四章 印出
第五章 Patterns
第六章 算式(Expression)作為Actions的敘述
第七章 Actions里面的控制敘述
第八章 內(nèi)建函式(Built-in Functions)
第九章 使用者定義的函式
第十章 實例
=======================================
第一章 前言
awk 是一個程式語言,對于文本處理具有很強的功能。對於文字檔里的資料做修改、比對、抽取等的處理,awk 能夠以很短的程式
輕易地完成。
awk 能夠依照使用者的定義格式來分解輸入,也可依照使用者定義的格式來打印輸出。
awk 名稱的由來是由它的原始
設(shè)計
者的姓氏之第一個字母而命名:Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。
awk最初在1977年完成。一個新版本的awk在1985年被發(fā)表,它的功能比舊版本增強不少。
gawk 是GNU所做的 awk,gawk 最初在1986年完成,之後不斷地被改進、更新,gawk 包含 awk 的所有功能。
后面的 gawk 將以下面的2個輸入檔案來做例子說明。
檔案'BBS-list':
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
bites 555-1675 2400/1200/300 A
camelot 555-0542 300 C
core 555-2912 1200/300 C
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C
檔案'shipped':
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
第二章 簡介
gawk 的主要功能是針對檔案的每一行(line)搜尋指定的 patterns。當一行里有符合指定的 patterns,gawk 就會在此一行執(zhí)行被指定
的 actions。 gawk 依此方式處理輸入檔案的每一行直到輸入檔案結(jié)束。
gawk 程式是由很多的
pattern 與 action
所組成,action 寫在大括號 { } 里面,一個pattern後面就跟著一個action。整個 gawk 程
式會像下面的樣子:
pattern {action}
pattern {action}
在 gawk 程式里面的規(guī)則,pattern 或 action 能夠被省略,但是兩個
不能同時被省略
。
如果 pattern 被省略,對於輸入檔里面的每一行,action 都會被執(zhí)行。如果 action 被省略,內(nèi)定的 action則會印出所有符合 pattern 的輸入行。
2.1 如何執(zhí)行g(shù)awk程式
基本上,有2個方法可以執(zhí)行g(shù)awk程式。
如果 gawk 程式很短,則 gawk 可以直接寫在 command line
gawk 'program' input-file1 input-file2 ...
?
如果 gawk 程式較長,較為方便的做法是將 gawk程序放在文件里
gawk -f program-file input-file1 input-file2 ...
gawk 程式的檔案不止一個時,執(zhí)行g(shù)awk 的格式如下所示:
gawk -f program-file1 -f program-file2 ... input-file1 input-file2 ...
2.2 一個簡單的例子
?
gawk '/foo/ {print $0}' BBS-list
實際的 gawk 程式為 /foo/ {print $0}。/foo/ 為 pattern,意思為搜尋輸入檔里的每一行是否含有子字串 'foo',如果含有 'foo' 則執(zhí)行 action。
action 為 print $0,是將現(xiàn)在這一行的內(nèi)容印出。BBS-list 是輸入的檔案。
會印出下面的結(jié)果:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C
2.3 一個較復雜的例子
gawk '$1 == "Feb" {sum=$2+$3} END {print sum}' shipped
現(xiàn)在這個例子會將輸入檔 'shipped' 的第一個欄位與 "Feb" 做比較,如果相等,則其對應的第2欄位與第3欄位的值會被加到變數(shù) sum。
對於輸入檔的每一行重復上述的動作,直到輸入檔的每一行都被處理過為止。最後將 sum 的值印出。END {print sum} 的意思為在所有的輸
入讀完之後,執(zhí)行一次 print sum 的動作,也就是把 sum 的值印出。
下面是執(zhí)行的結(jié)果:
84
第三章 讀取輸入檔案
gawk的輸入可以從標準輸入或指定的檔案里讀取。
輸入的讀取單位被稱為 “記錄”(records) ,gawk 在做處理時,是一個記錄一個記錄地處理。
一個記錄又被分為多個
字段(fields)。
默認情況下
,一個記錄為一行,即一行為單位處理;字段之間以空符號分隔,空格或者制表符(Tab)
3.1 如何將輸入分解成記錄(records)
gawk 語言會把輸入分解成記錄(record)。記錄與記錄之間是以record separator 隔開,record separator 的內(nèi)定值是表示新一行的
字元(newline character),因此內(nèi)定的 record separator 使得文字的每一行是一個記錄。
record separator 隨著
內(nèi)建變數(shù) RS
的改變而改變。RS 是一個字串,它的內(nèi)定值是"\n"。僅有 RS 的第一個字元是有效的,它被當作 record
separator,而 RS 的其它字元會被忽略。
內(nèi)建變數(shù)
FNR
會儲存目前的輸入檔案已經(jīng)被讀取的記錄之個數(shù)。
內(nèi)建變數(shù)
NR
會儲存目前為止所有的輸入檔案已經(jīng)被讀取的記錄之個數(shù)。
3.2 字段(field)
gawk 會自動將每個記錄分解成多個欄位 (field)。類似於字在一行里面,gawk 的內(nèi)定動作會認為欄位之間是以 whitespace 分開。在
gawk 里,whitespace 的意思是一個或多個空白或 tabs。
在 gawk 程式里面,
以'$1'表示第一個欄位,'$2'表示第二個欄位,依此類推。$0表示整個記錄。
舉個例子,假設(shè)輸入的一行如下所示:
This seems like a pretty nice example.
第一個欄位或 $1 是'This',第二個欄位或 $2 是 'seems',依此類推。
有個地方值得特別注意,第七個欄位或 $7 是'example.'而非'example'。
不論有多少欄位,
$NF
可用來表示一個記錄的最後一個欄位。以上面的例子為例,$NF 與 $7 相同,也就是'example.'。
NF 是一個內(nèi)建變數(shù)
,它的值表示目前這個記錄之欄位的個數(shù)。
下面是一個較復雜的例子:
gawk '$1~/foo/ {print $0}' BBS-list
結(jié)果如下:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C
這個例子是把輸入檔'BBS-list'的每個記錄的第一個欄位作檢查,如果它含有子字串'foo',則這一個記錄會被印出。
3.3 如何將記錄分解成欄位
gawk 根據(jù) field separator 將一個記錄分解成欄位。field separator 以
內(nèi)建變數(shù) FS
表示。
舉個例子,假如 field separator 是'oo',則下面的行:
moo goo gai pan
會被分成三個欄位:'m'、' g'、' gai pan'。
在 gawk 程式里,可以
使用'='來改變 FS 的值
。例如:
gawk 'BEGIN {FS=","}; {print $2}'
輸入行如下:
John Q. Smith, 29 Oak St., Walamazoo, MI 42139
執(zhí)行g(shù)awk的結(jié)果將印出字串 ' 29 Oak St.'。BEGIN 後面的 action 會在
第一個記錄被讀取之前執(zhí)行一次。
第四章 輸出
在gawk程式里,actions 最常做的事就是印出(printing)。簡單的印出,使用 print敘述。復雜格式的印出,使用 printf 敘述。
4.1 print敘述
print 敘述用在簡單、標準的輸出格式。敘述的格式如下所示:
print item1, item2, ...
輸出時,各個 item 之間會以一個空白分開,最後會換行(newline)。
如果 'print'敘述之後沒有跟著任何東西,它與'print $0'的效果一樣,它會印出現(xiàn)在的記錄(record)。
要印出空白行可使用'print ""'。 印出一段固定的文字,可用雙引號將文字的兩邊括起來,例如
'print "Hello there"'。
?
4.2 Output Separators
前面我們已提過如果 print 敘述包含有多個 item,item 之間用逗點分開,則印出時各個item會被一個空白隔開。你能夠使用任何的字串作為 output field separator,可以經(jīng)由內(nèi)建變數(shù)
OFS
的設(shè)定來更改 output field separator。OFS 的初始值為" ",即一格的空白。
整個 print 敘述的輸出被稱為 output record。print 敘述輸出 output record 之後,會接著輸出一個字串,此字串稱為 output
record separator。內(nèi)建變數(shù)
ORS
用來指明此字串。ORS 的初始值為 "\n",也就是換行。
下面這個例子會印出每個記錄的第一個欄位和第二個欄位,此二個欄位之間以分號';'分開,每行輸出之後會加入一個空白行。
gawk 'BEGIN {OFS=";"; ORS="\n\n"} {print $1, $2}' BBS-list
結(jié)果如下所示:
aardvark;555-5553
alpo-net;555-3412
barfly;555-7685
bites;555-1675
...
4.3 printf敘述
printf 敘述會使得輸出格式較容易精確地控制。printf 敘述可以指定每個 item 印出的寬度,也可以指定數(shù)字的各種型式。
printf 敘述的格式如下:
printf format, item1, item2, ...
print 與 printf 的差別是在於 format, printf 的引數(shù)比 print多了字串 format。format 的型式與 ANSI C 的 printf 之格式相同。
printf 并不會做自動換行的動作
。
內(nèi)建變數(shù) OFS 與 ORS 對 printf 敘述沒有任何影響。
格式的指定以字元'%'開始,後面接著格式控制字母。
格式控制字母如下所示:
'c' 將數(shù)字以 ASCII 字元印出。例如'printf "%C",65'會印出字元'A'。
'd' 印出十進位的整數(shù)。
'i' 印出十進位的整數(shù)。
'e' 將數(shù)字以科學符號的形式印出。例如print "$4.3e",1950結(jié)果會印出'1.950e+03'。
'f' 將數(shù)字以浮點的形式印出。
'g' 將數(shù)字以科學計數(shù)法或浮點的形式印出。數(shù)字的絕對值如果≥0.0001則以浮點的形式印出,否則以科學符號的形式印出。
'o' 印出無號的八進位整數(shù)。
's' 印出一個字串。
'x' 印出無號的十六進位整數(shù)。10至15以'a'至'f'表示。
'X' 印出無號的十六進位整數(shù)。10至15以'A'至'F"表示。
'%' 它并不是真正的格式控制字母,'%%"將印出"%'。
在 % 與格式控制字母之間可加入 modifier,modifier 是用來進一步控制輸出的格式。可能的 modifier 如下所示:
'-' 使用在 width 之前,指明是向左靠齊
。如果'-'沒有出現(xiàn),則會在被指定的寬度向右靠齊。例如:
printf "%-4S", "foo"??? 會印出'foo '。
'width' 這一個數(shù)字指示相對應的欄位印出時的寬度
。例如:
printf "%4s","foo"????? 會印出' foo'。
width 的值是一個最小寬度而非最大寬度。如果一個 item 的值需要的寬度比 width 大,則不受 width 的影響。例如
printf "%4s","foobar"??? 將印出'foobar'。
'.prec' 此數(shù)字指定印出時的精確度 。
它指定小數(shù)點右邊的位數(shù)。如果是要印出一個字串,它指定此字串最多會被印出多少個字元。
第五章 patterns
在 gawk 程式里面,當 pattern 符合現(xiàn)在的輸入記錄(record),其相對應的 action 才會被執(zhí)行。
5.1 Pattern的種類
這里對 gawk 的各種 pattern 型式作一整理:
/regular expression/
一個 regular expression 當作一個 pattern。每當輸入記錄 (record)含有 regular expression 就視為符合。
expression
一個單一的 expression。當一個值不為 0 或一個字串不是空的,則可視為符合。
pat1,pat2
一對的 patterns 以逗號分開,指定記錄的圍。
BEGIN
END
這是特別的 pattern, gawk 在開始執(zhí)行或要結(jié)束時會分別執(zhí)行相對應於BEGIN或END的 action。
null
這是一個空的pattern,對於每個輸入記錄皆視為符合pattern。
5.2 Regular Expressions當作Patterns
一個 regular expression 可簡寫為 regexp,是一種描述字串的方法。一個 regular expression 以斜線('/')包圍當作 gawk 的 pattern。
如果輸入記錄含有 regexp 就視為符合。例如:pattern 為 /foo/,對於任何輸入記錄含有'foo'則視為符合。
下面的例子會將含有'foo'的輸入記錄之第2個欄位印出。
gawk '/foo/ {print $2}' BBS-list
結(jié)果如下:
555-1234
555-6699
555-6480
555-2127
regexp 也能使用在比較的算式。
exp ~ /regexp/?
???? 如果 exp 符合 regexp,則結(jié)果為真(true)。
exp !~ /regexp/?
???
如果 exp 不符合 regexp,則結(jié)果為真。
5.3 比較的算式當作Patterns
x<y 如果 x 小於 y,則結(jié)果為真。
x<=y 如果 x 小於、等於 y,則結(jié)果為真。
x>y 如果 x 大於 y,則結(jié)果為真。
x>=y 如果 x 大於、等於 y,則結(jié)果為真。
x==y 如果 x 等於 y,則結(jié)果為真。
x!=y 如果 x 不等於 y,則結(jié)果為真。
x~y 如果 x 符合 regular expression y,則結(jié)果為真。
x!~y 如果 x 不符合 regular expression y,則結(jié)果為真。
上面所提到的 x 與 y,如果二者皆是數(shù)字則視為數(shù)字之間的比較,否則它們會被轉(zhuǎn)換成字串且以字串的形式做比較。兩個字串的比較,
會先比較第一個字元,然後比較第二個字元,依此類推,直到有不同的地方出現(xiàn)為止。如果兩個字串在較短的一個結(jié)束之前是相等,則視
為長的字串比短的字串大。例如 "10" 比 "9" 小,"abc" 比 "abcd" 小。
5.4 使用Bool運算的Patterns
一個布林(boolean) pattern 是使用或('||'),與('&&'),非('!')來組合其它的pattern。
例如:
gawk '/2400/ && /foo/' BBS-list
gawk '/2400/ || /foo/' BBS-list
gawk '! /foo/' BBS-list
第六章 算式(Expression)作為Actions的敘述
算式(Expression) 是gawk程式里面action的基本構(gòu)成者。
6.1 算術(shù)運算
gawk 里的算術(shù)運算如下所示:
x+y 加
x-y 減
-x 負
+x 正。實際上沒有任何影響。
x*y 乘
x/y 除
x%y 求馀數(shù)。例如 5%3=2。
x^y
x**y x 的 y 次方。例如2^3=8。
6.2 比較算式與布林算式
比較算式 (comparison expression) 用來比較字串或數(shù)字的關(guān)系,運算符號與 C 語言相同。表列如下:
x<y ,x<=y
x>y,x>=y
x==y,x!=y
x~y , x!~y
比較的結(jié)果為真(true)則其值是 1。否則其值是 0。布林算式(boolean expression)有下面三種:
boolean1 && boolean2
boolean1 || boolean2
! boolean
6.3 條件算式(Conditional Expressions)
一個條件式算式是一種特別的算式,它含有3個運算元。條件式算式與C語言的相同:
selector ? if-true-exp : if-false-exp
它有3個子算式。第一個子算式selector 首先會被計算。
如果是真,則if-true-exp會被計算且它的值變成整個算式的值。否則if-false-exp 會被計算且它的值變成整個算式的值。
?
第七章 Actions里面的控制敘述
在 gawk 程式里面,控制敘述諸如 if、while 等控制程式執(zhí)行的流程。在 gawk 里的控制敘述與 C 的類似。
很多的控制敘述會包括其它的敘述,被包括的敘述稱為 body。假如 body 里面包括一個以上的敘述,必須以大括弧 { } 將這些敘述括起
來,而各個敘述之間需以換行(newline)或分號隔開。
7.1 if 敘述
if (condition) then-body [else else-body]
舉一個例子如下:
if (x % 2 == 0)
print "x is even"
else
print "x is odd"
7.2 while 敘述
while (condition)
body
下面的例子會印出每個輸入記錄(record)的前三個欄位。
gawk '{ i=1
while (i <= 3) {
print $i
i++
}
}'
7.3 do-while 敘述
do
??????? body
while (condition)
下面的例子會印出每個輸入記錄十次。
gawk '{ i= 1
do {
print $0
i++
} while (i <= 10)
}'
7.4 for 敘述
for (initialization; condition; increment)
body
?
下面的例子會印出每個輸入記錄的前三個欄位。
gawk '{ for (i=1; i<=3; i++)
???? print $i
}'
7.5 break 敘述
break 敘述會跳出包含它的 for、while、do-while 回圈的最內(nèi)層。下面的例子會找出任何整數(shù)的最小除數(shù),它也會判斷是否為質(zhì)數(shù)。
gawk '# find smallest
div
isor of num
{ num=$1
for (div=2; div*div <=num; div++)
if (num % div == 0)
break
if (num % div == 0)
printf "Smallest divisor of %d is %d\n", num, div
else
printf "%d is prime\n", num }'
7.6 continue 敘述
continue 敘述使用於 for、while、do-while 回圈內(nèi)部,它會跳過回圈 body 的剩馀部分,使得它立刻進行下一次回圈的執(zhí)行。
下面的例子會印出 0 至 20 的全部數(shù)字,但是 5 并不會被印出。
gawk 'BEGIN {
for (x=0; x<=20; x++) {
if (x==5)
continue
printf ("%d",x)
}
print ""
}'
7.7 next 敘述、next file 敘述、exit 敘述
next 敘述強迫 gawk 立刻停止處理目前的記錄(record)而繼續(xù)下一個記錄。
next file 敘述類似 next。然而,它強迫 gawk 立刻停止處理目前的資料檔。
exit 敘述會使得 gawk 程式停止執(zhí)行而跳出。然而,如果 END 出現(xiàn),它會去執(zhí)行 END 的 actions。
第八章 內(nèi)建函式(Built-in Functions)
內(nèi)建函式是 gawk 內(nèi)建的函式,可在 gawk 程式的任何地方呼叫內(nèi)建
函式。
8.1 數(shù)值方面的內(nèi)建函式
int(x) 求出 x 的整數(shù)部份,朝向 0 的方向做舍去。例如:int(3.9)是 3,int(-3.9) 是 -3。
sqrt(x) 求出 x 正的平方根值。例 sqrt(4)=2
exp(x) 求出 x 的次方。例 exp(2) 即是求 e*e 。
log(x) 求出 x 的自然對數(shù)。
sin(x) 求出 x 的 sine 值,x 是弳度量。
cos(x) 求出 x 的 cosine 值,x 是弳度量。
atan2(y,x) 求 y/x 的 arctangent 值,所求出的值其單位是弳度量。
rand() 產(chǎn)生(0, 1)的隨機數(shù)。
srand(x) 設(shè)定 seed 為 x。
8.2 字串方面的內(nèi)建函式
index(in, find) 它會在字串 in 里面,尋找字串 find 第一次出現(xiàn)的位置。找不到則返回0。
length(string)
?
match(string,regexp)
match 函式會在字串 string 里面,尋找符合 reg的最長最靠左邊的子字串 index值。match 函式會設(shè)定內(nèi)在變數(shù) RSTART 等於 index,它也會設(shè)定內(nèi)在變數(shù) RLENGTH 等於符合的字元個數(shù)。如果不符合,則會設(shè)定 RSTART 為0、RLENGTH 為 -1。
?
sprintf(format,expression1,...) 返回字串。
?
sub(regexp, replacement,target)
在字串 target 里面,尋找符合 regexp 的最長、最靠左邊的地方,以字串 replacement
代替最左邊的
regexp。
例如:
str = "water, water, everywhere"
sub(/at/, "ith",str)
結(jié)果字串str會變成
"wither, water, everywhere"
gsub(regexp, replacement, target)
gsub 與前面的 sub 類似。在字串 target 里面,尋找符合 regexp 的所有地方,以字串 replacement
代替所有的
regexp。
例如:
str="water, water, everywhere"
gsub(/at/, "ith",str)
結(jié)果字串str會變成
'wither, wither, everywhere"
substr(string, start, length)
傳回字串 string 的子字串,這個子字串的長度為 length 個字元,從第 start 個位置開始。
?
tolower(string)
將字串string的大寫字母改為小寫字母。
例如:
tolower("MiXeD cAsE 123")
傳回值為"mixed case 123"
toupper(string)
將字串string的小寫字母改為大寫字母。
例如:
toupper("MiXeD cAsE 123")
傳回值為"MIXED CASE 123"
8.3 輸入輸出的內(nèi)建函式
close(filename)
將輸入或輸出的檔案 filename 關(guān)閉。
system(command)
此函式允許使用者執(zhí)行作業(yè)系統(tǒng)的指令,執(zhí)行完畢後將回到 gawk
程式。
例如:
BEGIN {system("ls")}
第九章 使用者定義的函式(User-defined Functions)
復雜的 gawk 程式常常可以使用自己定義的函式來簡化。呼叫使用者定義的函式與呼叫內(nèi)建函式的方法一樣。
9.1 函式定義的格式
函式的定義可以放在 gawk 程式的任何地方。
一個使用者定義的函式其格式如下:
function name (parameter-list) {
????????? body-of-function
}
name 是所定義的函式之名稱。一個正確的函式名稱可包括一序列的字母、數(shù)字、下標線 (underscores),但是不可用數(shù)字做開頭。
parameter-list 是列出函式的全部引數(shù)(argument),各個引數(shù)之間以逗點隔開。
body-of-function 包含 gawk 的敘述 (statement)。它是函式定義里最重要的部份,它決定函式實際要做何種事。
9.2 函式定義的例子
下面這個例子,會將每個記錄的第一個欄位之值的平方與第二個
欄位之值的平方加起來。
{print "sum =",SquareSum($1,$2)}
function SquareSum(x,y) {
sum=x*x+y*y
return sum
}
第十章 實例
這里將列出 gawk 程式的一些例子。
gawk '{if (NF > max) max = NF}
END {print max}'
此程式會印出所有輸入行之中,欄位的最大個數(shù)。
gawk 'length($0) > 80'
此程式會印出一行超過 80 個字元的每一行。此處只有 pattern 被
列出,action 是采用內(nèi)定的 print。
gawk 'NF > 0'
對於擁有至少一個欄位的所有行,此程式皆會印出。這是一個簡
單的方法,將一個檔案里的所有空白行刪除。
gawk '{if (NF > 0) print}'
對於擁有至少一個欄位的所有行,此程式皆會印出。這是一個簡
單的方法,將一個檔案里的所有空白行刪除。
gawk 'BEGIN {for (i = 1; i <= 7; i++)
print int(101 * rand())}'
此程式會印出□圍是 0 到 100 之間的 7 個亂數(shù)值。
ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'
此程式會印出所有指定的檔案之bytes數(shù)目的總和。
expand file | gawk '{if (x < length()) x = length()}
END {print "maximum line length is " x}'
此程式會將指定檔案里最長一行的長度印出。expand 會將 tab 改
成 space,所以是用實際的右邊界來做長度的比較。
gawk 'BEGIN {FS = ":"}
{print $1 | "sort"}' /etc/passwd
此程式會將所有使用者的login名稱,依照字母的順序印出。
gawk '{nlines++}
END {print nlines}'
此程式會將一個檔案的總行數(shù)印出。
gawk 'END {print NR}'
此程式也會將一個檔案的總行數(shù)印出,但是計算行數(shù)的工作由gawk
來做。
gawk '{print NR,$0}'
此程式印出檔案的內(nèi)容時,會在每行的最前面印出行號,它的功
能與 'cat -n' 類似。
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
