设为首页 收藏本站
查看: 932|回复: 0

[经验分享] Linux命令:grep

[复制链接]
YunVN网友  发表于 2018-5-19 09:21:02 |阅读模式
  grep命令简介:
  此命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
  
  egrep:  grep -e

  fgrep:   不支持正则表达式
  

1.命令格式:
     grep [options] PATTERN [FILE...]
         2.命令功能
   从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
   如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

  

        3.主要参数
     -c:只输出匹配行的计数
   -i:不区分大 小写(只适用于单字符)            ***
   -h:查询多文件时不显示文件名
   -l:查询多文件时只输出包含匹配字符的文件名
   -n:显示匹配行及 行号
    -s:不显示不存在或无匹配文本的错误信息
   -v:显示不包含匹配文本的所有行--反向搜索       ***

  
     -o  只显示匹配的字符串
     --color: 彩色显示匹配符部分                 ***
  

  grep:使用基本正则表达式定义的模式来过滤文本的命令;
      -E:  使用扩展正则表达式
      -A#:     after -A 2:匹配当前行和后2行
      -B#:     before -B 3:匹配当前行和前3行
      -C#:    context -C 4:匹配当前行和前后4行共9行
  

        支持正则表达式主要参数:
     \:  忽略正则表达式中特殊字符的原有含义。   转义符\
   ^:  匹配正则表达式的开始行。
   $:   匹配正则表达式的结束行。
   \<:  从匹配正则表达 式的行开始。
   \>:  到匹配正则表达式的行结束。
   [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

     .:   匹配任意单个字符
  
     \?:   匹配其前面的字符1次或0次
     \{m,n\}: 匹配其前面的字符至少m次,至多n次

     []:   匹配指定范围内的任意单个字符
     [^]:  匹配指定范围外的任意单个字符
     字符集合:      
          [[:digit:]]   [0-9]  
        [[:lower:]]   [a-z]
        [[:upper:]]   [A-Z]

          [[:alnum:]]   [0-9a-zA-Z]
  
        [[:space:]]   空格或tab
        [[:alpha:]]   [a-zA-Z]

          [[:punct:]]   字符/符号
支持扩展正则表达式:-E选项  grep -E = egrep

  | : 或者表示符  比如a|bc|ca  表示a或者bc或者ca
  . :匹配任意单个字符
  []:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符


      * :匹配其前面的字符任意次(包括0次)

:匹配其前面的字符0次或者1次
+ :匹配其前面的字符至少1次            (相当于正则表达式中\{1,\})


{m,n}: 直接使用大括号不用使用转移符\,表示至少m次,最多n次  

   {n} :匹配前面的字符n次


4.命令实例:
    实例一:*: 匹配其前面的字符任意次(贪婪模式)   
      [root@fox tmp]# cat 2.txt      a, b, ab, aab, acb, adb, amnb,amnbamnb,
      [root@fox tmp]#grep 'a.*b' 2.txt     ab, aab, acb, adb, amnb,amnbamnb,
      [root@fox tmp]#grep 'a\?b' 2.txt   b, ab, aab, acb, adb, amnb,amnbamnb,
      [root@fox tmp]#grep 'a*b' 2.txt    b, ab, aab, acb, adb, amnbamnbamnb
  
      [root@fox tmp]#grep 'a\{1,3\}b' 2.txt   ab, aab
      [root@fox tmp]#grep 'a.\{1,3\}b' 2.txt    aab, acb, adb, amnbamnbamnb
  

       --==>>> .*:任意长度的任意字符
       --==>>> \{ m,n\}有转义符grep看到  { m,n }为命令行展开
  

  
    实例二:位置锚定

  
      ^: 锚定行首,此字符后面的任意内容必须出现在行首
      $: 锚定行尾,此字符前面的任意内容必须出现在行尾
      ^$: 空白行

      \<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
      \>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
      [root@fox tmp]#grep 'w$' /etc/inittab
      ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  

      [root@fox tmp]#grep 'b..h$' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    oracle:x:500:500:oracle:/home/oracle:/bin/bash

  

      [root@fox tmp]# grep '^$' /etc/inittab | wc -l
    9

  

      [root@fox tmp]# grep '[[:digit:]]$' /etc/inittab
    #   5 - X11
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2

  

      [root@fox tmp]# cat grub.conf
    root (hd0,0)
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
    initrd /initrd-2.6.18-164.el5.img
    [root@fox tmp]# grep 'quiet\b' grub.conf
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet

  

      # more size.txt | grep -i 'b1..*3'  忽略大小写
    b124230
    b103303
    B10223303

  

    实例三:分组
  
      \(\)
      \(ab\)*
      后向引用
      \1:引用第一个左括号以及与之对应的右括号所包括的所有内容
      \2:

      \3:

     

     [root@localhost ~]# cat test3
    He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.
    she like him

     [root@localhost ~]# grep 'l..e' test3

      He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.
    she like him

     [root@localhost ~]# grep 'l..e.*l..e' test3
    He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.

     [root@localhost ~]# grep '\(l..e\).*\1' test3
    He love his lover.
    She like her liker.

  

     [root@localhost ~]# grep '\([0-9]\).*\1$' /etc/inittab
    #   5 - X11
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2

  

    实例四:或者
      |: or
      C|cat:  C 或 cat   前后两个单词

      (C|c)at:  Cat 或 cat  分组

     grep -E = egrep

      grep --color -E '`[[:space:]]+' /boot/grub/grub.conf

  

  
    实例五IP地址查询
         表示点字符:\.  转义

         表示单引用:''  

         示重复n次:{n}
  # ifconfig | egrep --color  '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
      inet addr:35.109.231.195  Bcast:10.109.131.255  Mask:255.255.252.0
    inet addr:172.16.1.105  Bcast:172.16.1.255  Mask:255.255.255.0

      inet addr:172.16.1.106  Bcast:172.16.1.255  Mask:255.255.255.0
    inet addr:127.0.0.1  Mask:255.0.0.0

  

      eg1以下使用{n}表示重复前同字符
       # ifconfig | egrep --color  '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
       inet addr:35.109.231.195  Bcast:10.109.131.255  Mask:255.255.252.0
    inet addr:172.16.1.105  Bcast:172.16.1.255  Mask:255.255.255.0

      inet addr:172.16.1.106  Bcast:172.16.1.255  Mask:255.255.255.0
    inet addr:127.0.0.1  Mask:255.0.0.0

  

       eg2、以下使用-o表示只显示匹配部分

       # ifconfig | egrep --color -o '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
    35.109.231.195
    10.109.131.255

      255.255.252.0
    172.16.1.105

      172.16.1.255
      255.255.255.0
      172.16.1.106
      172.16.1.255
      255.255.255.0
      127.0.0.1
      255.0.0.0

  

  
      eg3以下表示A B C:1-223 三类地址
      # ifconfig | egrep  '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]| 1[0-9][0-9]|2[0-4][0-9]| 25[0-4])\>'
    inet addr:127.0.0.1  Mask:255.0.0.0

  

      分析:\<([1-9] | [1-9][0-9] | 1[0-9]{2} |  2[01][0-9] | 22[0-3])\>
            个位 | 十位10-99 | 百位100-199 | 百位200-119 | 百位220-223

  

      A为一串字符时加括号: \<(A)\>   即:以A开始且以A结束
      [0-9]重复2次      1[0-9]{2}  即:100-199
  

    实例六:常用grep实例
      (1) # ps -ef | grep in.telnetd  

    (2) # more size.txt | grep '[a-b]' 范围 ;如[A-Z]即A,B,C一直到Z都符合要求

    (3) # more size.txt | grep '[a-b]'*  

    (4) # more size.txt | grep '[bB]'  

    (5) # more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配项的行  

    (6) # more size.txt | grep -in 'b1..*3'

    (7) # grep '$' /etc/init.d/nfs.server | wc -l

    (8) # grep '\$' /etc/init.d/nfs.server | wc –l 忽略正则表达式中特殊字符的原有含义

    (9) # grep '\$' /etc/init.d/nfs.server

  
    (10)多个文件查询
         grep "sort" *.doc      #见文件名的匹配

    (11)行匹配:输出匹配行的计数
         grep -c "48" data.doc    #输出文档中含有48字符的行数

    (12)显示匹配行和行数
         grep -n "48" data.doc    #显示所有匹配48的行和行号

    (13)显示非匹配的行
         grep -vn "48" data.doc   #输出所有不包含48的行

    (14)显示非匹配的行
         grep -vn "48" data.doc   #输出所有不包含48的行

    (15)大小写敏感
         grep -i "ab" data.doc    #输出所有含有ab或Ab的字符串的行

  
    (16)正则表达式的应用 (注意:最好把正则表达式用单引号括起来)
        grep '[239].' data.doc    #输出所有含有以2,3或9开头的,并且是两个数字的行

    (17)不匹配测试
        grep '^[^48]' data.doc    #不匹配行首是48的行

    (18)使用扩展模式匹配
        grep -E '219|216' data.doc

  
    (19)grep '5[[:upper:]][[:upper:]]' data.doc   #查询以5开头以两个大写字母结尾的行

  
    (20)加()后是锚定整个字符串

  # egrep '\<([1-9]| [1-9][0-9]| 1[0-9][0-9]| 2[0-4][0-9]| 25[0-5])\>'  /boot/grub/grub.conf --color      

  timeout=5
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
    initrd /initrd-2.6.18-164.el5.img

  

  

附:关于grep和egrep的一些整理                  
  grep:
  格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.

grep '\<Tom\>' file   包含单词Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy开头的行
grep '\.bak$' file 包含以.bak结束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
grep '[A-Z]' file 包含至少一个大写字母的行
grep '[0-9]' file 包含至少一个数字的行
grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w '[tT]est' file 包含单词和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
grep -n tom file   打印匹配的行并追加行号.
grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep '$name' file 打印包含字符$name的行.

  

  egrep:
  egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
扩展表达式:
+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间.

egrep '^+' file   以一个或者多个空格开头的行.
grep '^*' file   同上
egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep '(ab)+' file 包含至少一个ab的行.
egrep 'x[0-9]?' file 包含x或者x后面跟着0个或者多个数字的行.
egrep 'fun\.$' * 所有文件里面以fun.结尾的行.
egrep '[A-Z]+' file 至少包含一个大写字母的行.
egrep '[0-9]' file 至少一个数字的行.
egrep '[A-Z]...[0-9]' file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep '[tT]est' file 包含单词test或Test的行.
egrep 'ken sun' file 包含ken sun的行.
egrep -v 'marry' file 不包含marry的行.
egrep -i 'sam' file 不考虑sam的大小写,含有sam的行.
egrep -l "dear ken" * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s "$name" file 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到.



元字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
*匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o?”将匹配所有“o”。
.点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“”或“”。
(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern)正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?<=pattern)反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d匹配一个数字字符。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]。
\f匹配一个换页符。等价于\x0c和\cL。
\n匹配一个换行符。等价于\x0a和\cJ。
\r匹配一个回车符。等价于\x0d和\cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t匹配一个制表符。等价于\x09和\cI。
\v匹配一个垂直制表符。等价于\x0b和\cK。
\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。
\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号()。
  


---END---

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-461895-1-1.html 上篇帖子: linux 远程下载 下篇帖子: linux命令:alias
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表