忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
123下一页
最近访问板块 发新帖
查看: 17454 | 回复: 28

[文本处理] 关于 awk 的 pattern(模式) [复制链接]

论坛徽章:
51
CU十四周年纪念徽章
日期:2017-07-31 15:08:46CU十四周年纪念徽章
日期:2015-11-25 15:35:40白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:532015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之大阪钢巴
日期:2015-06-25 17:30:04黄金圣斗士
日期:2015-12-02 11:44:35程序设计版块每日发帖之星
日期:2015-12-22 06:20:00
发表于 2016-06-02 18:25 |显示全部楼层
本帖最后由 reyleon 于 2016-10-18 14:25 编辑


闲的蛋疼, 所以写的我理解的东西, 大神勿喷.

我们知道, awk程序由一系列 pattern 以及与之对应的 action 组成的 rule 组成,rule之间用";"分号隔开, 一条输入记录与 pattern 匹配则执行与之关联的action, 如下所示:

awk '
        pattern { action };
        pattern { action };
        .....
'

可是, 很多人并不清楚什么东西可以做为 pattern下面就来聊聊这些个事儿. 以下文本做为测试文本:

  1. $ cat myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
首先, 要记住, 凡是被 {} 包裹的, 就是 action, 或者说, action 必然被 {} 包裹着
凡是没有被{}包裹的, 就是pattern, 或者说pattern不能被{}包裹着.

一. 正则表达式做为 pattern

最常见的, 就是一个正则表达式做为一个 pattern了, 如:

awk '/555-5553/ { print $0 }' myfile

/555-5553/ 就是一个正则表达式, 如果输入记录匹配555-5553, 就输出这条记录, 这里只有第一行匹配 555-5553, 所以就输出了第一行这条记录.
  1. $ awk '/555-5553/ { print $0 }' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
复制代码
二. 比较表达式做为 pattern
  1. $ awk '$NF == "A" { print $0 }' myfile
  2. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  3. Becky      555-7685  becky.algebrarum@gmail.com       A
  4. Bill       555-1675  bill.drowning@hotmail.com        A
  5. Martin     555-6480  martin.codicibus@hotmail.com     A
  6. Samuel     555-3430  samuel.lanceolis@shu.edu         A
复制代码
最后一个字段为 "A" 的, 输出这条记录.
  1. $ awk '$NF != "A" { print $0 }' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  4. Camilla    555-2912  camilla.infusarum@skynet.be      R
  5. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  6. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  7. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
最后一个字段不为 "A" 的, 输出这条记录.

三. 常量表达式做为 pattern

这种pattern一般是最不易被新手理解的, 事实上, 既然是 pattern 匹配, 结果就只有两种情况, 要么匹配(即为真),就执行后面的 action, 要么不匹配(即为假), 就不会执行后面的action.
所以, awk 的规则基本上也就是:

awk ' 真 { 执行代码 }; 假 { 不执行代码 }'

也理解为:

awk ' 条件 { 动作 } 条件 { 动作 } '

什么东西可以做为一个常量? 一个数字, 或者一个字符串, 都可以做为一个常量 pattern. 那这里就有一个龟腚了:

凡是非0的数字, 就表示pattern匹配成功, 也就是pattern为真. 否则表示匹配失败, 为假.
凡是非空的字符串, 就表示pattern匹配成功, 也就是pattern为真. 否则表示匹配失败, 为假.

注意: 字符串是由引号引起来的! 比如数字 0 与 字符串 "0" 不是一样的. 数字0为假, 字符串"0"为真(不为空).

如:
  1. $ awk '1 { print $0 }' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
  1. $ awk '2 { print $0 }' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
  1. $ awk '0 { print $0 }' myfile

  2. // 数字 0 做为 pattern, 0为假, pattern 匹配失败, 所以不执行 print $0, 没有打印.
复制代码
  1. $ awk ' "0" { print $0 }' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R

  13. // 字符串 "0" 做为 pattern, 为真, pattern 匹配成功, 所以执行 print $0, 打印.
复制代码
还有一些, 可能是写错的赋值语句做为了pattern的, 或者其他乱七八糟的, 等等..:
  1. $ awk 'a=0'  myfile // 数字0. 假, 没输出.
复制代码
  1. $ awk 'a=1'  myfile // 1 为真.
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
  1. $ awk 'x-1'  myfile // x 为未定义的变量, 做数学运算, 结果为 -1 , 因 -1 也是非0的数字常量, pattern 匹配成功, 为真, print $0.
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
  1. $ awk 'xxoo'  myfile //xxoo为变量, 未赋值, 为假
复制代码
  1. $ awk '"xxoo"'  myfile // 字符串, 真.
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
四. 空 pattern
  1. $ awk '{print $0}' myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Anthony    555-3412  anthony.asserturo@hotmail.com    A
  4. Becky      555-7685  becky.algebrarum@gmail.com       A
  5. Bill       555-1675  bill.drowning@hotmail.com        A
  6. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  7. Camilla    555-2912  camilla.infusarum@skynet.be      R
  8. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  9. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  10. Martin     555-6480  martin.codicibus@hotmail.com     A
  11. Samuel     555-3430  samuel.lanceolis@shu.edu         A
  12. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
// 这里没有 pattern, 空的, empty pattern, 那么就表示匹配输入记录永远成功, 也就是说永远为真, 这是龟腚. action永远都会执行.

我们知道, awk 的rule 就是由一系列 pattern 和 action 构成, 这里所谓的空 pattern, 也可以说是省略了 pattern, 那么 action 可不可以省略呢?
事实上, action也是可以省略的, 但如果省略了的话,它就会有一个默认的action行为, 即 { print $0 } !
很多人新手经常搞不懂一下的代码:

awk '{a=1}1' myfile

经常会碰到有人问, 这个代码后面的1是干嘛的? 其实, 我们拆分下 awk 的 rule 就明白了.
awk '{a=1}1' 这个语句包含了两条规则:

awk '
        [空pattern] {a=1}    #第一条规则
        1 [{省略的action}]   #第二条规则
'


第一条rule: {a=1} , 这条规则这里有一个{}大括号包裹着, 表示这是一个 action, 但是省略了pattern, 即空pattern,
上面说了, 空pattern是永远匹配为真的,
所以{a=1}这个action会针对每条输入记录对执行,只是我们看不到它的具体表现而已.

第二条rule: 1, 这条规则仅仅只有一个1字, 没有被{}大括号包裹着,
所以这个1是一个pattern, 省略了{action}, 而这个数字 1 , 实际上就是一个常量表达式pattern, 因它为非0的数字,所以pattern匹配成功,为真,就执行action,
因为这里省略了{action},就触发默认的行为,而默认的action行为是print $0,即打印这条记录.

再如: awk '1;1' ,省略了两个action, 所以这条实际上就是两个 {print $0}{print $0}.

所以, 凡是action只是要输出这条记录的, 通通都可以省略这个 action.

如:
  1. $ awk '/Amelia/ || /Martin/'  myfile
  2. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  3. Martin     555-6480  martin.codicibus@hotmail.com     A

  4. $ awk '$NF ~ /F/'  myfile
  5. Amelia     555-5553  amelia.zodiacusque@gmail.com     F
  6. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  7. Julie      555-6699  julie.perscrutabor@skeeve.com    F

  8. $ awk 'NR==5'  myfile
  9. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
复制代码
五. 特殊的 pattern: BEGIN, END ..

在 awk 中, 肯定会经常看到 BEGIN, END 这两个玩意儿. 如 awk 'BEGIN { ... } END { ... } '

实际上, BEGIN 和 END 只是两个特殊的 pattern . 类似的还有 BEGINFILE,  ENDFILE.

BEGIN 在读入文件之前匹配成功, 即为在读入文件之前这条 rule 就已经执行了.
END 在处理完文件之后才匹配陈宫, 即在处理完文件之后才会执行这条 rule.
  1. $ awk 'BEGIN { n=5 } NR==n { print $0 } END { print $0 }' myfile
  2. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  3. Jean-Paul  555-2127  jeanpaul.campanorum@nyu.edu      R
复制代码
分析下这条 awk 语句:
首先, 它包含三条规则
1. BEGIN { n=5 }  ,BEGIN 为 特殊pattern, {n=5} 为 action
2. NR==n { print $0 }, NR==n 是一个比较表达式pattern, { print $0 } 为action.
3. END { print $0 }, END 也是一个特殊的pattern.

BEGIN 模式一般读入文件之前常用的是做一些相关的定义操作, 这里设定变量n=5.
然后awk开始处理记录, 当 NR==n 时, 即处理到我们定义的那条记录时(第5条记录时), 执行 print $0, 输出这条记录.
最后是END模式, awk处理完文件里, END模式匹配成功,执行print $0, 即输出最后一条记录.
所以, 结果是输出第5条记录和最后一条记录.


六. 模式范围: begpat, endpat

这个模式范围, 是由两个 pattern 组成, 每个 pattern可以是任意的非特殊类型(非BEGIN/END模式类型)的pattern类型(可以是正则,比较,常量等pattern).
这个模式范围匹配的规则有点儿特殊, 这里以一个"开闸放水"的例子做为一个类比.
1. 首先以第一个pattern匹配输入记录, 如果第一个pattern匹配成功,就"打开放水的开关开始放水",[开关的状态: 开], 即会立即执行后面的action.此时不管第二个pattern是否匹配.
2. 接着再匹配第二pattern, 如果第二pattern匹配失败,开关的状态不变,即还是会执行action.
3. 接着继续以第二个pattern匹配下一条输入记录,直到第二个pattern匹配成功. 就"关闭放水的开关停止放水",[开关的状态: 关], 模式范围匹配结束.
4. 以1,2,3步骤进入下一轮模式范围匹配

如:
  1. $ awk 'NR==4, /555-3430/ { print $0}' myfile
  2. Bill       555-1675  bill.drowning@hotmail.com        A
  3. Broderick  555-0542  broderick.aliquotiens@yahoo.com  R
  4. Camilla    555-2912  camilla.infusarum@skynet.be      R
  5. Fabius     555-1234  fabius.undevicesimus@ucb.edu     F
  6. Julie      555-6699  julie.perscrutabor@skeeve.com    F
  7. Martin     555-6480  martin.codicibus@hotmail.com     A
  8. Samuel     555-3430  samuel.lanceolis@shu.edu         A
复制代码
先执行 NR==4 这个 pattern 匹配, 当第四条记录匹配成功时, 放水开关打开, 开始放水了, 即开始执行action , 执行 print $0 , 输出第四条记录.
接着使用 /555-3430/ 当前记录, 不成功.
第5条记录继续执行 action.继续以第二个pattern匹配这条记录..不成功..,开关是开的
第6条记录继续执行 action.继续以第二个pattern匹配这条记录..不成功..,开关是开的
...
..
直到匹配 /555-3430/, 第二个pattern匹配成功. 开关关闭. 模式范围匹配结束..
开始下一轮模式范围匹配..


以上就是各种 pattern 的简要解说了.. 至于 action, 也没啥可说的, action一般做具体的事情.
那些个流程控制语句 if/for/while 等一般都属于action了, 不能做为 pattern了.






评分

参与人数 11可用积分 +17 信誉积分 +90 收起 理由
expert1 + 5 很给力!
_寒_CU + 10 很给力!
jcdiy0601 + 10 赞一个!
番茄罐头 + 10 很给力!
夏寥寥 + 10 太好了!解开了我好多疑惑!
daili0703 + 12 赞一个!
关阴月飞 + 10 噢,我的天啦,快来看呀,这真难得,我的意.
songyc_2015 + 10 六哥的套路杠杠的!
haooooaaa + 10 很给力!
Herowinter + 10 赞一个!

查看全部评分

打赏鼓励一下!

4人打赏

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2016-06-02 18:44 |显示全部楼层
一如既往的六

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-06-02 18:50 |显示全部楼层
awk 菜鸟 前来顶贴!!! 顶顶顶!!!

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
发表于 2016-06-02 19:10 |显示全部楼层
看完了,之前不是很理解。看了这个大概知道了。好文章,说的很细,推荐新手看看~

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2016-06-02 22:37 |显示全部楼层
六哥的套路还是杠杠的

论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2016-06-30 20:52 |显示全部楼层
六神龙虾就是好吃!此文要火呀!

论坛徽章:
13
水瓶座
日期:2014-05-08 10:54:2015-16赛季CBA联赛之四川
日期:2016-06-14 09:09:0915-16赛季CBA联赛之佛山
日期:2016-05-23 16:08:24天蝎座
日期:2014-12-01 11:49:46技术图书徽章
日期:2014-03-27 09:08:21卯兔
日期:2014-03-13 11:44:36丑牛
日期:2014-03-11 15:21:02技术图书徽章
日期:2014-02-21 16:06:45天秤座
日期:2014-01-02 09:30:33巨蟹座
日期:2014-04-28 11:15:23申猴
日期:2013-12-17 16:58:57射手座
日期:2013-12-16 15:19:40
发表于 2016-07-01 09:21 |显示全部楼层
好贴,果断mark,读完对awk的理解上了一个层次啊~

论坛徽章:
7
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:41程序设计版块每日发帖之星
日期:2016-07-04 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-08-09 06:20:00
发表于 2016-07-01 12:31 |显示全部楼层
前排占位~~~~

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-11-10 06:20:00IT运维版块每日发帖之星
日期:2016-07-19 06:20:00JAVA
日期:2016-10-25 16:03:37PHP
日期:2016-10-25 16:03:37Python
日期:2016-10-25 16:03:37
发表于 2016-07-05 11:42 |显示全部楼层
涨知识了

论坛徽章:
0
发表于 2016-07-11 09:24 |显示全部楼层
这个文章好,受教了!~lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP