免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 16068 | 回复: 27

[文本处理] awk1line 实现 sed1line [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-05-14 07:08 |显示全部楼层
本帖最后由 yinyuemi 于 2014-08-12 14:52 编辑

sed1line代码来自http://sed.sourceforge.net/sed1line.txt,用awk1line实现,请大家指正,欢迎拍砖!
  1. FILE SPACING:

  2. # double space a file

  3. -> sed G

  4. -> awk '$0=$0 ORS'  or awk '1{print ""}' or: awk -vORS="\n\n" '1'


  5. # double space a file which already has blank lines in it. Output file

  6. # should contain no more than one blank line between lines of text.

  7. -> sed '/^$/d;G'

  8. -> awk NF ORS='\n\n'


  9. # triple space a file

  10. -> sed 'G;G'

  11. -> awk '$0=$0 ORS ORS'


  12. # undo double-spacing (assumes even-numbered lines are always blank)

  13. -> sed 'n;d'

  14. -> awk 'i=!i'
  15. (有很多可以实现这个的awk方法,这里只给出黑哥的码)

  16. # insert a blank line above every line which matches "regex"

  17. -> sed '/regex/{x;p;x;}'

  18. -> awk '/regex/{$0=ORS $0}1'


  19. # insert a blank line below every line which matches "regex"

  20. -> sed '/regex/G'

  21. -> awk '/regex/{$0=$0 ORS}1' or: awk '{ORS=(/regex/)?"\n\n":"\n"}1'


  22. # insert a blank line above and below every line which matches "regex"

  23. -> sed '/regex/{x;p;x;G;}'

  24. -> awk '/regex/{$0=ORS $0 ORS}1'


  25. NUMBERING:

  26. # number each line of a file (simple left alignment). Using a tab (see

  27. # note on '\t' at end of file) instead of space will preserve margins.

  28. -> sed = filename | sed 'N;s/\n/\t/'

  29. -> awk '{print NR"\t"$0}' filename


  30. # number each line of a file (number on left, right-aligned)

  31. -> sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'

  32. -> awk '{printf "%6s  %s\n", NR,$0}' filename


  33. # number each line of file, but only print numbers if line is not blank

  34. -> sed '/./=' filename | sed '/./N; s/\n/ /'

  35. -> awk '{print NF?NR" "$0:$0}' filename


  36. # count lines (emulates "wc -l")

  37. -> sed -n '$='

  38. -> awk 'END{print NR}'


  39. TEXT CONVERSION AND SUBSTITUTION:

  40. # IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.

  41. -> sed 's/.$//'               # assumes that all lines end with CR/LF

  42. -> awk '{sub(/.$/,"",$0);print}'

  43. -> sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M

  44. -> awk '{sub(/^M$/,"",$0);print}'

  45. -> sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher
  46. -> gawk '{sub(/\x0D$/,"",$0);print}'

  47. # IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.

  48. -> sed "s/$/`echo -e \\\r`/"            # command line under ksh
  49. -> sed 's/"/`echo \\\r`/"             # command line under bash
  50. -> sed "s/$/`echo \\\r`/"               # command line under zsh
  51. -> sed 's/$/\r/'                        # gsed 3.02.80 or higher
  52. -> gawk '{sub(/$/,"\r",$0);print}'

  53. # delete leading whitespace (spaces, tabs) from front of each line

  54. # aligns all text flush left

  55. -> sed 's/^[ \t]*//'                    # see note on '\t' at end of file

  56. -> awk '{sub(/^[ \t]*/,"",$0);print}'


  57. # delete trailing whitespace (spaces, tabs) from end of each line

  58. -> sed 's/[ \t]*$//'                    # see note on '\t' at end of file

  59. -> awk '{sub(/[ \t]*$/,"",$0);print}'


  60. # delete BOTH leading and trailing whitespace from each line

  61. -> sed 's/^[ \t]*//;s/[ \t]*$//'

  62. -> awk '{sub(/^[ \t]*/,"",$0);sub(/[ \t]*$/,"",$0);print}'


  63. # insert 5 blank spaces at beginning of each line (make page offset)

  64. -> sed 's/^/     /'

  65. -> awk '{sub(/^/,"     ",$0);print}'


  66. # align all text flush right on a 79-column width

  67. -> sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # set at 78 plus 1 space

  68. -> awk '{printf "%79s\n",$0}'


  69. # center all text in the middle of 79-column width. In method 1,

  70. # spaces at the beginning of the line are significant, and trailing

  71. # spaces are appended at the end of the line. In method 2, spaces at

  72. # the beginning of the line are discarded in centering the line, and

  73. # no trailing spaces appear at the end of lines.

  74. -> sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # method 1
  75. -> sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # method 2

  76. -> awk '{t=(79-length)/2+length;printf "%"t"s%"79-t"s\n",$0," "}' #length=length($0)


  77. # substitute (find and replace) "foo" with "bar" on each line

  78. -> sed 's/foo/bar/'             # replaces only 1st instance in a line

  79. -> awk '{sub(/foo/,"bar");print}'

  80. -> sed 's/foo/bar/4'            # replaces only 4th instance in a line

  81. -> gawk '{$0=gensub(/foo/,"bar",4,$0);print}'

  82. -> sed 's/foo/bar/g'            # replaces ALL instances in a line

  83. -> awk '{gsub(/foo/,"bar");print}'

  84. -> sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # replace the next-to-last case

  85. -> gawk '{$0=gensub(/(.*)foo(.*foo)/,"\\1bar\\2","g",$0);print}'

  86. -> sed 's/\(.*\)foo/\1bar/'            # replace only the last case

  87. -> gawk '{$0=gensub(/(.*)foo/,"\\1bar","g",$0);print}'

  88. # substitute "foo" with "bar" ONLY for lines which contain "baz"

  89. -> sed '/baz/s/foo/bar/g'

  90. -> awk '/baz/{gsub(/foo/,"bar")}1'


  91. # substitute "foo" with "bar" EXCEPT for lines which contain "baz"

  92. -> sed '/baz/!s/foo/bar/g'

  93. -> awk '!/baz/{gsub(/foo/,"bar")}1'


  94. # change "scarlet" or "ruby" or "puce" to "red"

  95. -> sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'   # most seds

  96. -> gsed 's/scarlet\|ruby\|puce/red/g'                # GNU sed only

  97. -> gawk '{gsub(/scarlet|ruby|puce/,"red");print}'

  98. # reverse order of lines (emulates "tac")

  99. # bug/feature in HHsed v1.5 causes blank lines to be deleted

  100. -> sed '1!G;h;$!d'               # method 1
  101. -> sed -n '1!G;h;$p'             # method 2

  102. -> awk '{a[NR]=$0}END{i=NR;while(i>=1) print a[i--]}'


  103. # reverse each character on the line (emulates "rev")

  104. -> sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

  105. -> awk -vFS= '{i=NF;while(i>=1) printf $(i--);print ""}'


  106. # join pairs of lines side-by-side (like "paste")

  107. -> sed '$!N;s/\n/ /'

  108. -> awk 'ORS=NR%2?FS:RS' or: awk '{getline line;print $0 FS line}'


  109. # if a line ends with a backslash, append the next line to it

  110. -> sed -e :a -e '/\\$/N; s/\\\n//; ta'

  111. -> awk '/\\$/{sub(/\\$/,"");printf $0;next}1'


  112. # if a line begins with an equal sign, append it to the previous line

  113. # and replace the "=" with a single space

  114. -> sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

  115. -> awk -vRS='\n=' -vORS=' ' '{print}'


  116. # add commas to numeric strings, changing "1234567" to "1,234,567"

  117. -> gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
  118. -> sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # other seds

  119. -> awk -v FS=OFS= '{for(i=2;i<=NF;i++) $i=(NF-i+1)%3?$i:","$i}1'

  120.   
  121. # add commas to numbers with decimal points and minus signs (GNU sed)

  122. -> gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'

  123. -> awk -v FS=OFS= '{for(i=$1=="-"?3:2;i<=NF;i++) if($i==".") break; else {$i=(NF-i+1)%3?$i:","$i}}1'


  124. # add a blank line every 5 lines (after lines 5, 10, 15, 20, etc.)

  125. -> gsed '0~5G'                  # GNU sed only
  126. -> sed 'n;n;n;n;G;'             # other seds

  127. -> awk '{$0=NR%5?$0:$0 ORS}1'


  128. SELECTIVE PRINTING OF CERTAIN LINES:

  129. # print first 10 lines of file (emulates behavior of "head")

  130. -> sed 10q

  131. -> awk 'NR==10{print;exit}1' or:awk '1;NR==10{exit}' (多谢Tim兄)


  132. # print first line of file (emulates "head -1")

  133. -> sed q

  134. -> awk 'NR==1{print;exit}' or: awk '{print;exit}' (多谢Tim兄)


  135. # print the last 10 lines of a file (emulates "tail")

  136. -> sed -e :a -e '$q;N;11,$D;ba'

  137. -> awk '{a[NR]=$0;delete a[NR-10]}END{for(i=NR-9;i<=NR;i++) print a[i]}'


  138. # print the last 2 lines of a file (emulates "tail -2")

  139. -> sed '$!N;$!D'

  140. -> awk '{a=b;b=$0}END{print a ORS b}'


  141. # print the last line of a file (emulates "tail -1")

  142. -> sed '$!d'                    # method 1
  143. -> sed -n '$p'                  # method 2

  144. -> awk 'END{print $0}'


  145. # print the next-to-the-last line of a file

  146. -> sed -e '$!{h;d;}' -e x              # for 1-line files, print blank line

  147. -> awk '{a=b;b=$0}END{print a}'

  148. -> sed -e '1{$q;}' -e '$!{h;d;}' -e x  # for 1-line files, print the line

  149. -> awk '{a=b;b=$0}END{print a?a:b}'

  150. -> sed -e '1{$d;}' -e '$!{h;d;}' -e x  # for 1-line files, print nothing

  151. -> awk '{a=b;b=$0}END{printf a?a ORS:""}'


  152. # print only lines which match regular expression (emulates "grep")

  153. -> sed -n '/regexp/p'           # method 1
  154. -> sed '/regexp/!d'             # method 2

  155. -> awk '/regxp/'


  156. # print only lines which do NOT match regexp (emulates "grep -v")

  157. -> sed -n '/regexp/!p'          # method 1, corresponds to above
  158. -> sed '/regexp/d'              # method 2, simpler syntax

  159. -> awk '!/regxp/'


  160. # print the line immediately before a regexp, but not the line

  161. # containing the regexp

  162. -> sed -n '/regexp/{g;1!p;};h'

  163. -> awk '{a=b;b=$0}/regexp/{print a}'


  164. # print the line immediately after a regexp, but not the line

  165. # containing the regexp

  166. -> sed -n '/regexp/{n;p;}'

  167. -> awk '/regexp/{getline line;print line}'


  168. # print 1 line of context before and after regexp, with line number

  169. # indicating where the regexp occurred (similar to "grep -A1 -B1")

  170. -> sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

  171. -> awk '{a=b;b=c;c=$0}b~/6/{printf "%s\n%s\n%s\n%s\n",NR-1,a,b,c}'


  172. -> awk '{a=b;b=$0}/6/{getline c;print NR-1"\n"a"\n"b"\n"c}'


  173. # grep for AAA and BBB and CCC (in any order)

  174. -> sed '/AAA/!d; /BBB/!d; /CCC/!d'

  175. -> awk '/AAA/&&/BBB/&&/CCC/'


  176. # grep for AAA and BBB and CCC (in that order)

  177. -> sed '/AAA.*BBB.*CCC/!d'

  178. -> awk '/AAA.*BBB.*CCC/'


  179. # grep for AAA or BBB or CCC (emulates "egrep")

  180. -> sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # most seds
  181. -> gsed '/AAA\|BBB\|CCC/!d'                        # GNU sed only

  182. -> awk '/AAA|BBB|CCC/'


  183. # print paragraph if it contains AAA (blank lines separate paragraphs)

  184. # HHsed v1.5 must insert a 'G;' after 'x;' in the next 3 scripts below

  185. -> sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

  186. -> awk -vRS='\n\n' '/AAA/'


  187. # print paragraph if it contains AAA and BBB and CCC (in any order)

  188. -> sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

  189. -> awk -vRS='\n\n' '/AAA/&&/BBB/&&/CCC/'


  190. # print paragraph if it contains AAA or BBB or CCC

  191. -> sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
  192. -> gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # GNU sed only

  193. -> awk -vRS='\n\n' '/AAA|BBB|CCC/'


  194. # print only lines of 65 characters or longer

  195. -> sed -n '/^.\{65\}/p'

  196. -> awk 'length>=65'


  197. # print only lines of less than 65 characters

  198. -> sed -n '/^.\{65\}/!p'        # method 1, corresponds to above
  199. -> sed '/^.\{65\}/d'            # method 2, simpler syntax

  200. -> awk 'length<65' or awk 'NF<65' FS=


  201. # print section of file from regular expression to end of file

  202. -> sed -n '/regexp/,$p'

  203. -> awk '/regexp/,0' or awk '/regexp/,EOF'


  204. # print section of file based on line numbers (lines 8-12, inclusive)

  205. -> sed -n '8,12p'               # method 1
  206. -> sed '8,12!d'                 # method 2

  207. -> awk 'NR==8,NR==12' OR awk 'NR>=8&&NR<=12'


  208. # print line number 52

  209. -> sed -n '52p'                 # method 1
  210. -> sed '52!d'                   # method 2
  211. -> sed '52q;d'                  # method 3, efficient on large files

  212. -> awk 'NR==52{print;exit}'


  213. # beginning at line 3, print every 7th line

  214. -> gsed -n '3~7p'               # GNU sed only
  215. -> sed -n '3,${p;n;n;n;n;n;n;}' # other seds

  216. -> awk 'NR>=3&&!((NR-3)%10)'


  217. # print section of file between two regular expressions (inclusive)

  218. -> sed -n '/Iowa/,/Montana/p'             # case sensitive

  219. -> awk '/Iowa/,/Montana/'


  220. SELECTIVE DELETION OF CERTAIN LINES:

  221. # print all of file EXCEPT section between 2 regular expressions

  222. -> sed '/Iowa/,/Montana/d'

  223. -> awk 'Iowa/,Montana/{next}1'


  224. # delete duplicate, consecutive lines from a file (emulates "uniq").

  225. # First line in a set of duplicate lines is kept, rest are deleted.

  226. -> sed '$!N; /^\(.*\)\n\1$/!P; D'

  227. -> awk '{printf $0==v?"":$0 ORS;v=$0}' or: awk 'a !~ $0; {a=$0}'


  228. # delete duplicate, nonconsecutive lines from a file. Beware not to

  229. # overflow the buffer size of the hold space, or else use GNU sed.

  230. -> sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

  231. -> awk '!a[$0]++'


  232. # delete all lines except duplicate lines (emulates "uniq -d").

  233. -> sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

  234. -> awk '!(a[$0]++-1)'


  235. # delete the first 10 lines of a file

  236. -> sed '1,10d'

  237. -> awk '++p>10'


  238. # delete the last line of a file

  239. -> sed '$d'

  240. -> awk '{a=b;b=$0}NR>1{print a}' OR: awk '{a[NR+1]=$0;if(NR>1)print a[NR]}'


  241. # delete the last 2 lines of a file

  242. -> sed 'N;$!P;$!D;$d'

  243. -> awk '{a[NR+2]=$0;if(NR>2)print a[NR]}' OR: awk '{a=b;b=c;c=$0}NR>2{print a}'



  244. # delete the last 10 lines of a file

  245. -> sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
  246. -> sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

  247. -> awk '{a[NR+10]=$0;if(NR>10)print a[NR]}'

  248. (如果文件非常大,内存有限的话,加个delete,如下

  249. -> awk '{a[NR+10]=$0;if(NR>10){print a[NR]
  250. ;delete a[NR]}}')

  251. # delete every 8th line

  252. -> gsed '0~8d'                           # GNU sed only
  253. -> sed 'n;n;n;n;n;n;n;d;'                # other seds

  254. -> awk 'NR%8'


  255. # delete lines matching pattern

  256. -> sed '/pattern/d'

  257. -> awk '/pattern/{next}1'



  258. # delete ALL blank lines from a file (same as "grep '.' ")

  259. -> sed '/^$/d'                           # method 1
  260. -> sed '/./!d'                           # method 2

  261. -> awk NF


  262. # delete all CONSECUTIVE blank lines from file except the first; also

  263. # deletes all blank lines from top and end of file (emulates "cat -s")

  264. -> sed '/./,/^$/!d'          # method 1, allows 0 blanks at top, 1 at EOF

  265. -> awk '{/^$/?p--:p=1}!p>=0'

  266. -> sed '/^$/N;/\n$/D'        # method 2, allows 1 blank at top, 0 at EOF

  267. -> awk -v p=1 '{/^$/?p--:p=1}!p>=0'


  268. # delete all CONSECUTIVE blank lines from file except the first 2:

  269. -> sed '/^$/N;/\n$/N;//D'

  270. -> awk -v p=2 '{/^$/?p--:p=2}!p>=0'


  271. # delete all leading blank lines at top of file

  272. -> sed '/./,$!d'

  273. -> awk '!/^$/{p=1}p' OR: awk '!/^$/,0'


  274. # delete all trailing blank lines at end of file

  275. -> sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # works on all seds
  276. -> sed -e :a -e '/^\n*$/N;/\n$/ba'        # ditto, except for gsed 3.02.*

  277. -> awk -vRS='[\n]* '1'


  278. # delete the last line of each paragraph

  279. -> sed -n '/^$/{p;h;};/./{x;/./p;}'

  280. -> awk '{a=b;b=$0}NR>1{printf /^$/?"":a ORS}'


复制代码
总的来说,awk 和 sed是各有所长,灵活应用它们,基本上可以应付日常的文本处理。

补充:关于/foo1/,/foo2/匹配在sed和awk使用中的异同。(非常感谢Tim的指正和帮助!!)

相同的情况:
  1. echo 'xxx
  2. foo1
  3. yyy
  4. foo2
  5. zzz' | sed -n '/foo1/,/foo2/p'
  6. foo1
  7. yyy
  8. foo2

  9. echo 'xxx
  10. foo1
  11. yyy
  12. foo2
  13. zzz' |awk '/foo1/,/foo2/'
  14. foo1
  15. yyy
  16. foo2

  17. 即上面正文中,/foo1/,/foo2/匹配的awk和sed代码等同,指的是这种情况

复制代码
不同的情况:
  1. echo 'xxx
  2. foo1 foo2
  3. yyy
  4. foo2
  5. zzz' | sed -n '/foo1/,/foo2/p'
  6. foo1 foo2
  7. yyy
  8. foo2

  9. echo 'xxx
  10. foo1 foo2
  11. yyy
  12. foo2
  13. zzz' | awk '/foo1/,/foo2/'
  14. foo1 foo2

  15. #所以这样情况下,awk代码需要作一定的锚定

  16. echo 'xxx
  17. foo1 foo2
  18. yyy
  19. foo2
  20. zzz' | awk '/^foo1/,/^foo2/'
  21. foo1 foo2
  22. yyy
  23. foo2

复制代码

评分

参与人数 3可用积分 +23 收起 理由
Shell_HAT + 5 Well done!
xiaopan3322 + 8 我只能说:I 服了 U
ywlscpl + 10

查看全部评分

论坛徽章:
0
发表于 2011-05-14 09:26 |显示全部楼层
支持

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-05-14 12:15 |显示全部楼层
回复 2# ywlscpl


    多谢老兄支持

论坛徽章:
30
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3719周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-CU
日期:2019-09-08 23:26:25
发表于 2011-05-14 14:01 |显示全部楼层
楼主再来个sed1line实现awk1line吧

http://bbs.chinaunix.net/thread-1635180-1-1.html

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-05-14 14:21 |显示全部楼层
回复 4# Shell_HAT


   我也想过试试,awk1line:http://www.pement.org/awk/awk1line.txt, 不过看起来大部分都是重复的,awk数组和计数的部分似乎很难用one line的sed解决,所以放弃了

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2011-05-14 16:42 |显示全部楼层
强贴留名,好好研读。

论坛徽章:
0
发表于 2011-05-14 17:50 |显示全部楼层
很欣赏楼主的专注精神。请问,lz工作是和正则相关的吗?

论坛徽章:
0
发表于 2011-05-14 17:53 |显示全部楼层
很欣赏楼主的专注精神。请问,lz工作是和正则相关的吗?
shellyxz 发表于 2011-05-14 17:50



    我帮SS兄回答了……不是……而且毫无关系……所以人家才是大牛

论坛徽章:
0
发表于 2011-05-14 18:00 |显示全部楼层
回复 8# xiaopan3322


      牛!!!
   
     很专注

论坛徽章:
0
发表于 2011-05-14 18:14 |显示全部楼层
SS 兄厉害啊 收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP