资讯专栏INFORMATION COLUMN

Linux Daily2

haitiancoder / 1408人阅读

摘要:文件编码查看文件编码格式文件乱码下生成的纯文本文件,其中文编码为,在下显示为乱码,可以使用命令进行转换未知处的非法输入序列转码实践执行方式第一个参数是目录第二个是文件选择执行最后一个文件报错总线错误解决

1. 文件编码 查看文件编码格式
# vi .vimrc
:set fileencoding
  fileencoding=utf8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1

# vi XXX.file
:set fencs?
  fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1
:set fenc?
  fileencoding=cp936
:set enc?
  encoding=utf-8
cat文件乱码

Windows下生成的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令进行转换:

# iconv -f gbk -t utf8 source_file > target_file
iconv: 未知 5 处的非法输入序列
GBK转码实践
#!/bin/bash
if [ "$#" != "2" ]; then
  echo "Usage: `basename $0` dir filter"
  exit
fi
dir=$1
filter=$2
echo $1

for file in `find $dir -name "$2"`; do
  echo "$file"
  iconv -f gbk -t utf8 -o $file $file
done

执行方式: 第一个参数是目录, 第二个是文件选择

~/ftp/GBK2UTF-8_batch.sh ./  M_EP_PD_AQI*
~/ftp/GBK2UTF-8_batch.sh ./  M_EP_PH_AQI*
~/ftp/GBK2UTF-8_batch.sh ./  M_METE_CITY_PRED*
~/ftp/GBK2UTF-8_batch.sh ./  M_METE_WEATHER_LIVE*

执行最后一个, 文件>32kb, 报错:

4361 总线错误 (core dumped) iconv -c -f gbk -t utf8 -o $file $file

解决方式: http://myotragusbalearicus.wordpress.com/2010/03/10/batch-convert-file...
还是不行: http://www.path8.net/tn/archives/3448
使用//IGNORE, 成功!

  iconv -f gbk//IGNORE -t utf8//IGNORE $file -o $file.tmp

注意原始文件必须是和-f对应,如果原始文件是utf8, 要再次转换成utf8, 也会报错.

GBK2UTF8.sh

#!/bin/bash
if [ "$#" != "2" ]; then
  echo "Usage: `basename $0` dir filter"
  echo "sample: ./GBK2UTF8.sh /home/midd/ftp/fz12345/back/2015-03 fz12345_*.txt"
  exit
fi
dir=$1
filter=$2
tmp="T"
echo $1

for file in `find $dir -name "$2"`; do
  echo "$file"
  #iconv -f gbk -t utf8 -o $file $file
  #Notic, the Source File should not utf8 format. or u "ll get error
  iconv -f gbk//IGNORE -t utf8//IGNORE $file -o $tmp$file
done
磁盘 查看文件大小

ll -h只能查看文件的大小. 不能查看文件夹占用的大小.

查看某个目录总的大小

cd dir
du -h ./

在最后会列出这个文件夹占用的大小. 或者不用cd, 直接du -h dir

扩容操作

查看磁盘使用量: df -mh
根目录/达到了100% : /dev/mapper/vg_datanode01-LogVol00

查看卷: vgdisplan:

---Volume group ---
VG Name    vg_datanode01

--- Logical volume ---
LV Path      /dev/vg_datanode01/LogVol00

扩容:

lvextend -L +10G  /dev/mapper/vg_datanode01-LogVol00
resize2fs /dev/mapper/vg_datanode01-LogVol00
3. 系统 文件数和进程数
[midd@datanode01 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62700
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[midd@datanode01 ~]$ ps -ef | grep ETL
midd     14369     1  0 Mar29 ?        00:00:00 ETL_ScheduleCenter     
midd     14370 14369 99 Mar29 ?        5-06:14:46 ETL_ScheduleServer     
midd     14442 14369  6 Mar29 ?        02:33:41 ETL_ServerManger       
midd     41892 41839  0 10:19 pts/3    00:00:00 grep ETL

[midd@datanode01 ~]$ lsof -p 14369 | wc -l
20
[midd@datanode01 ~]$ lsof -p 14370 | wc -l
928
[midd@datanode01 ~]$ lsof -p 14442 | wc -l
4169
[midd@datanode01 ~]$ cat /proc/sys/fs/file-max
792049

[midd@datanode01 ~]$ su - 
[root@datanode01 ~]# vi /etc/security/limits.conf
* soft nofile 65536 * hard nofile 65536
添加以上, 其中*表示任何用户.  注意要用root用户执行. 

或者使用root用户添加指定用户的文件数和进程数:

echo "########################for ETL 4.1.0" >> /etc/security/limits.conf
echo "midd soft nofile 65536" >> /etc/security/limits.conf
echo "midd hard nofile 65536" >> /etc/security/limits.conf
echo "midd soft nproc 131072" >> /etc/security/limits.conf
echo "midd hard nproc 131072" >> /etc/security/limits.conf
echo "midd soft nofile 65536" >> /etc/security/limits.conf
echo "midd hard nofile 65536" >> /etc/security/limits.conf
echo "midd soft nproc 131072" >> /etc/security/limits.conf
echo "midd hard nproc 131072" >> /etc/security/limits.conf

然后使用midd用户验证ulimit

[midd@datanode01 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62700
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 131072
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

另外方法:http://gaozzsoft.iteye.com/blog/1824824

1.使用ps -ef |grep java   (java代表你程序,查看你程序进程) 查看你的进程ID,记录ID号,假设进程ID为122.使用:lsof -p 12 | wc -l    查看当前进程id为12的 文件操作状况    执行该命令出现文件使用情况为 10523.使用命令:ulimit -a   查看每个用户允许打开的最大文件数    发现系统默认的是open files (-n) 1024,问题就出现在这里。4.然后执行:ulimit -n 4096
     将open files (-n) 1024 设置成open files (-n) 4096
这样就增大了用户允许打开的最大文件数
内存/进程
free
free -m     以MB为单位
free -g     以GB为单位

df
df -m       以MB
df -h       以人类(human)可读的, 即GB

pstree -p | wc -l   

进程和端口

根据端口号查询进程名字

lsof -Pnl +M -i4[i6] | grep 20880

top命令

按M可以按照Memory排序, 按P按照CPU排序
按u可以选择指定的user, 只显示该用户的进程
top -p $(pidof mongod)      只显示指定的进程

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                      
 4735 midd      20   0 30.1g 748m 4944 S  2.0  9.5 102:39.94 mongod       

killall 命令可以杀死同一个进程的所有子进程.
如果用ps -ef | grep 则要一个一个杀.
比如ps -ef | grep ETL 显示一共由三个相关进程

[midd@datanode01 bin]$ ps -ef | grep ETL
midd      4812 41955  0 16:01 pts/3    00:00:00 grep ETL
midd     42276     1  0 15:52 ?        00:00:00 ETL_ScheduleCenter     
midd     42277 42276 99 15:52 ?        00:15:35 ETL_ScheduleServer     
midd     42345 42276  7 15:53 ?        00:00:34 ETL_ServerManger

而用killall 只需要一行: killall ScheduleCenter

用户和权限

添加用户, 设置密码

useradd -d /home/postgres postgres 
passwd postgres 

更改读写权限, 地柜目录使用大写的R. (注意scp时用的是小写的r)

chmod 755 file
chmod -R 755 folder

更改用户名:组

chown hadoop:hadoop -R folder
定时任务cron

1.编写脚本

# vi /usr/lib/zookeeper/bin/cron.day 
#bin/sh
cd /usr/lib/zookeeper/bin
./zkCleanup.sh /opt/hadoop/zookeeper/version-2 5
echo "clean up end..."

2.更改脚本权限

# chmod 755 /usr/lib/zookeeper/bin/cron.day 

3.定时调度策略

# cd /etc/cron.d
# vi /etc/cron.d/zk.cron 
0 13 * * * root run-parts /usr/lib/zookeeper/bin/cron.day

4.导入调度配置

# crontab zk.cron

5.查看调度列表

# crontab -l
0 13 * * * root run-parts /usr/lib/zookeeper/bin/cron.day

6.查看是否调度的日志

# tail -f /var/log/cron
Apr  1 13:00:01 namenode02 CROND[41859]: (root) CMD (root run-parts /usr/lib/zookeeper/bin/cron.day)

其他知识点:

# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
4. 文件操作 wordcount计数

计算文件的行数: wc -l file.txt
要统计单词数量, 加上w选项. L选项表示最长行的长度. 注意这是一整行.不能按照列计算最长长度.

帮助信息: $ wc --help. 如果不知道一个命令, 最好看看--help

用法:wc [选项]... [文件]...
 或:wc [选项]... --files0-from=F
  -c, --bytes            print the byte counts
  -m, --chars            print the character counts
  -l, --lines            print the newline counts
  -L, --max-line-length 显示最长行的长度
  -w, --words           显示单词计数
      --help        显示此帮助信息并退出
      --version     显示版本信息并退出
grep查找
ps -ef | grep ETL  查看进程
cat fz12345_original.txt | grep FZ15032700599 查找一个文件里的字符串

查找目录下的文件里的内容

cat foder/*.* | grep XXX
find /etc/ -name "*" | xargs grep XXX

注意: 第一个cat命令无法用于递归子目录, 第二个命令/etc后面必须跟上/, 而且name是*

大文件定位到某一行
sed -n "111,112p" file.txt
find文件名

在指定目录查找文件名: find ~/repo -name *tmp*

使用管道, xargs表示递归找到的每个值. 如果是文件, 使用rm. 如果是文件夹, 用rm -rf.
递归删除svn文件夹: find SVNFOLDER -name .svn | xargs rm -rf
递归删除文件: find ~/repo -name *tmp* | xargs rm

文件内容替换

替换为, :%s/ /,/

ORACLE类型转换为hive类型:

%s/STRING(.*)/STRING/
%s/VARCHAR2(.*)/STRING/
%s/CHAR(.*)/STRING/
%s/DATE,/STRING,/
%s/date,/STRING,/
%s/INTEGER/INT/
%s/NUMBER(..)/BIGINT/
%s/NUMBER(.)/INT/
%s/NUMBER(.*)/DOUBLE/
%s/.not null//
rename批量修改文件名
rename .XLS .xlsx *.XLS     把文件名=.XLS的替换成.xlsx
rename \_linux "" *.txt         把文件名=_linux的替换成空, 注意_要用转义, 即去掉文件名包含_linux的
rename -Unlicensed- "" *.xlsx       
exp脚本
dacp_720.exp
#!/usr/bin/expect
set tableName [lindex $argv 0]
#spawn ssh dacp@172.17.212.72 /home/dacp/dp-executor/dacp-dp-executor-1.0.0.RELEASE/go.sh 
#20141218 lhx_fzdc_test01
spawn ssh dacp@172.17.212.72 
/home/dacp/dp-executor/dacp-dp-executor-1.0.0.RELEASE/go.sh 20141218 $tableName
expect "password:"
send "dacp@123
"
interact

http://wgkgood.blog.51cto.com/1192594/1271543
http://blog.51yip.com/linux/1462.html

自动交互

http://bbs.chinaunix.net/thread-915007-1-1.html
http://os.51cto.com/art/200912/167898.htm

ftp文件夹下载

wget ftp://172.17.227.236/ctos_analyze/data/tmp/* --ftp-user=ftpd --ftp-password=ftpd123 -r
*必须要有, 最后的-r表示目录下载

wget -r -l 1 http://www.baidu.com/dir/

文件续传: wget -c xxx.file

文件按行数分割
$ wc -l dispatch2012.csv 
231272 dispatch2012.csv

$ split -l 60000 dispatch2012.csv dispatch2012_new.csv 
$ ll
-rw-r--r-- 1 hadoop hadoop 27649615  9月 27  2014 dispatch2012.csv
-rw-rw-r-- 1 hadoop hadoop  7115577  4月 14 19:08 dispatch2012_new.csvaa
-rw-rw-r-- 1 hadoop hadoop  7188497  4月 14 19:08 dispatch2012_new.csvab
-rw-rw-r-- 1 hadoop hadoop  7208496  4月 14 19:08 dispatch2012_new.csvac
-rw-rw-r-- 1 hadoop hadoop  6137045  4月 14 19:08 dispatch2012_new.csvad
$ wc -l dispatch2012_new.csv*
   60000 dispatch2012_new.csvaa
   60000 dispatch2012_new.csvab
   60000 dispatch2012_new.csvac
   51272 dispatch2012_new.csvad
  231272 总用量
压缩和解压
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName
.tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileName.tar.gz DirName———————————————.bz2解压1:bzip2 -d FileName.bz2解压2:bunzip2 FileName.bz2压缩: bzip2 -z FileName
.tar.bz2解压:tar jxvf FileName.tar.bz2压缩:tar jcvf FileName.tar.bz2 DirName———————————————.bz解压1:bzip2 -d FileName.bz解压2:bunzip2 FileName.bz压缩:未知
.tar.bz解压:tar jxvf FileName.tar.bz压缩:未知———————————————.Z解压:uncompress FileName.Z压缩:compress FileName.tar.Z
解压:tar Zxvf FileName.tar.Z压缩:tar Zcvf FileName.tar.Z DirName———————————————.zip解压:unzip FileName.zip压缩:zip FileName.zip DirName———————————————.rar解压:rar x FileName.rar压缩:rar a FileName.rar DirName———————————————.lha解压:lha -e FileName.lha压缩:lha -a FileName.lha FileName———————————————.rpm解包:rpm2cpio FileName.rpm | cpio -div———————————————.deb解包:ar p FileName.deb data.tar.gz | tar zxf -———————————————.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea解压:sEx x FileName.*压缩:sEx a FileName.* FileName
5. vi

显示行号: :set number
打开文件定位到最后一行: vi + file.txt
从指定行删除到最后一行

方法1: 
使用set number计算当前行和最后一行的差比如100
输入100dd
6. Awk/sed 列编辑
replace(replace(DISPATCHMEMO,chr(10),""),chr(9),"")

awk "{print "<" $0 "> "}" O_FZ12345_CALLINFO>O_FZ12345_CALLINFO2
awk "{print "select count(*) from " $0 " union all 
"}" cl>cl2

awk "{print "replace(replace(" $0 ",chr(10),""),chr(9),"")"}" O_FZ12345_CALLINFO>O_FZ12345_CALLINFO2

awk "{print "replace(replace(" $0 ",chr(10),""),chr(9),"")"}" c3>c4

%s/,)/,"")/

alter table owner to etl;
awk "{print "alter table " $0 " owner to etl;"}" test>test2
列的最大长度

下面2个语句执行的结果不同??
打印结果时,用双引号
awk "{if (length($NF)>maxlength) maxlength=length($NF)} END {print maxlength" "$1" "$2" "$NF}" fz12345_original.txt

找出最后一列的最大长度  
awk "{if (length($NF)>maxlength) maxlength=length($NF)} END {print maxlength }" fz12345_original.txt   

找出最大长度的那一条记录  
awk "length($NF)==2016 {print $1" "$2" "$NF}" fz12345_original.txt  

最后一列为空  
awk "{$NF="" ;print $0}" fz12345_original.txt  | head  

截取最后一列:  
awk "{print substr($NF, 0, 900)}" fz12345_original.txt  

打印一整行:  
awk "{print $0}" fz12345_original.txt  

打印第一列和最后一列, 最后一列被截取, 以	分割  
awk "{$NF=substr($NF, 0, 900) ;print $1"	"$NF}" fz12345_original.txt  | head  

截取最后一列, 并打印整行. 但是分隔符变成空格. 如果原先内容有空格,则无法正确解析  
awk "{$NF=substr($NF, 0, 900) ;print $0}" fz12345_original.txt  | head  

截取最后一列, 打印整行, 分隔符为	  
awk "BEGIN {OFS="	"}{$NF=substr($NF, 0, 900) ;print $0}" fz12345_original.txt | head  

行的字段数不一样. 是因为如果有些字段值为空: 如果是空值,则不会被计算为一列!  
awk "{print NF}" fz12345.txt | head  
awk "{print NF}" fz12345_original.txt | head  

输出字段分隔符:  
awk "BEGIN {OFS="	"}{$NF=substr($NF, 0, 900) ;print $0}" fz12345_original.txt > fz12345.txt  
输入字段分隔符,输出字段分隔符:  
awk "BEGIN {FS="	";OFS="	"}{$NF=substr($NF, 0, 900) ;print $0}" fz12345_original.txt > fz12345.txt  
输入字段,输入行,输出字段,输出行分隔符:  
awk "BEGIN {FS="	";RS="
";OFS="	";ORS="
";}{$NF=substr($NF, 0, 900) ;print $0}" fz12345_original.txt > fz12345.txt  

awk FS="	" "{$NF=substr($NF, 0, 900) ;print $0}" OFS="	" fz12345_original.txt > fz12345.txt  


  
awk  -F:"{print $1,$3,$6}" OFS="	" /etc/passwd  
/etc/passwd文件是以:为分隔符的. 取出第1,3,6列. 以	分割!  
一列转多行
hadoop@hadoop:~$ echo "A|B|C|aa,bb|DD" | awk -F| "BEGIN{OFS="|"}{split($4,a,",");for(i in a){$4=a[i];print $0}}"
A|B|C|aa|DD
A|B|C|bb|DD
hadoop@hadoop:~$ echo "A|B|C|aa|DD" | awk -F| "BEGIN{OFS="|"}{split($4,a,",");for(i in a){$4=a[i];print $0}}"
A|B|C|aa|DD

awk "BEGIN{FS="	";OFS="	"}{split($5,a,",");for(i in a){$5=a[i];print $0}}" 
fz12345_dispatch_2014.txt > fz12345_dispatch_2014_2.txt

转换前文件:
2251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市城乡建设委员会,福州市交通运输委员会       0       1       10      2015-04-10 16:29:50

转换后文件:
2251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市城乡建设委员会    0       1       10      2015-04-10 16:29:50
2251562 FZ15032600537   福州市信访局    2015-03-26 16:29:50     福州市交通运输委员会    0       1       10      2015-04-10 16:29:50

去掉文件中的所有双引号: sed -i "s/"//g" dispatch2012.csv

将^M删除

sed -i "s/"//g" dispatch2012.csv                        ×
tr -d "^M" < dispatch2012_2.csv                     ×

alias dos2unix="sed -i -e "s/""$(printf "15")""//g" "      √
dos2unix dispatch2012_2.csv                         
sed -i -e "s/""$(printf "15")""//g" dispatch2012_2.csv     报错: bash: 未预期的符号 `(" 附近有语法错误

删除第一行: sed -i "1d;$d" dispatch2012_2.csv

第五列因为乱码直接改为空字符串!
awk "BEGIN {FS=",";RS=" ";OFS=" ";ORS=" ";}{$5="";print $0}" dispatch2012.csv > dispatch2012_2.csv

7.其他

制作程序启动脚本:

arg=$1
cmd=""

if [ $arg == "idea" ]; then
  cmd="/home/hadoop/tool/idea-IU-139.225.3/bin/idea.sh"
fi

echo "应用程序启动命令:$cmd"
nohup $cmd &

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9044.html

相关文章

  • Linux Daily2

    摘要:文件编码查看文件编码格式文件乱码下生成的纯文本文件,其中文编码为,在下显示为乱码,可以使用命令进行转换未知处的非法输入序列转码实践执行方式第一个参数是目录第二个是文件选择执行最后一个文件报错总线错误解决 1. 文件编码 查看文件编码格式 # vi .vimrc :set fileencoding fileencoding=utf8 set fileencodings=ucs-b...

    dongxiawu 评论0 收藏0
  • Linux_《Linux命令行与shell脚本编程大全》第一章学习总结

    摘要:命令行与脚本编程大全第三版第一章学习总结第一章初识本章内容什么是内核的组成探索桌面了解发行版什么是分为以下四部分内核工具图形化桌面环境应用软件深入探究内核系统的核心是内核。 时间:2017年04月05日 说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第一章学习总结 第一章:初识Linu...

    bawn 评论0 收藏1
  • Linux - 收藏集 - 掘金

    摘要:探索之旅第三部分第五课延时执行,唯慢不破掘金作者谢恩铭转载请注明出处内容简介第三部分第五课延时执行,唯慢不破第三部分第六课预告第三部分测验题延时执行,唯慢不破上一课探索之旅第三部分第四课后台运行及合并多个终端中,我们学习了后台进程以及 Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破 - 掘金-- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第五课:延时执行,唯慢不破 ...

    wenzi 评论0 收藏0
  • Linux - 收藏集 - 掘金

    摘要:这一课我们来学探索之旅第三部分第一课数据处理,慢条斯理掘金作者谢恩铭转载请注明出处内容简介第三部分第一课数据处理,慢条斯理第三部分第二课预告流管道重定向,三管齐下数据处理,慢条斯理哈哈,终于到了第三部分了。 Linux 基础之常用命令篇 - 后端 - 掘金最近一段时间工作实在是太忙了,所以好久没有写文章了,趁着周末把linux 的相关知识,整理了下。这一篇文件主要记录了一些linux的...

    lolomaco 评论0 收藏0
  • (干货)Linux学习资源推荐

    摘要:国际协会有大量的资源列表。学习的最好网站,也是使用经验的汇聚地。全球占有率最高的服务器的网站,学习它的最好场所。的官方网站转自干货学习资源推荐 国内的专业Linux网站(GB) ChinaUnix Linux中国 实验楼: 免费提供了Linux在线实验环境,不用在自己机子上装系统也可以学习Linux,超方便实用!。 国内的专业Linux网站(BIG5) 香港Linux用户协会...

    wangshijun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<