文本处理工具

•diff 命令
•patch 命令
•grep 命令
•Cut 命令
•sort 命令
•uniq 命令
•tr 命令
•sed 命令




diff 命令
• diff 命令用于比较两个文件的内容 , 以了解其区别。它还可用于创建补丁文件。补丁文件用于在企业环境的多台计算机之间对相似文件进行更改.
-c ##显示上下文周围的行
-u ##使用统一输出格式(对于生成补丁文件很有用)
-r ##从指定的目录开始文件执行递归式比较




修补命令 patch

patch 采用补丁文件 patchfile ( 包含由 diff 生成的差异列表 ) 并将这些差异应用于生成补丁版的一个或多个原始文件。通常 , 补丁版替换原始文件 , 但当指定 -b 选项时 , 可以制作备份。将用 .orig 文件名后缀重命名原始文件
• patch 可用于将简单的补丁文件应用于使用以下语法的单个文件
– [root@host etc]# patch issue patchfile
Patching file issue

以下命令显示如何使用通过 diff -Naur 创建的补丁文件。用户更改为与从中创建补丁文件的原始目录相似的可比较目录后 , 将执行 patch
– [user@host orig-dir]$ patch -b < /tmp/patchfile
Patching file hosts
Patching file network




  117  vim file
  118  vim file1
  119  cat file
  120  cat file1
  121  diff file file1 ##比较不同
  122  diff -c file file1 ##显示上下文周围的行
  123  diff -u file file1 ##使用统一输出格式(对于生成补丁文件很有用)
       diff -r ##从指定的目录开始文件执行递归式比较
  124  diff -u file file1 > file.path
  125  cat file.path 
  126  yum install patch -y
  127  patch file file.path 
  128  cat file
  129  ls
  130  vim file
  131  cat file
  133  patch -b file file.path ##这一步生成file.orig文件,是法ile之前的内容
  134  ls
  135  cat file.orig 
  136  cat file
  137  history

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

[root@localhost ~]# vim file

[root@localhost ~]# vim file1
[root@localhost ~]# cat file
hello
[root@localhost ~]# cat file1
hello
123
[root@localhost ~]# diff file file1
1a2
> 123
[root@localhost ~]# diff -c file file1
*** file 2017-04-29 21:08:28.338550683 -0400
--- file1 2017-04-29 21:08:51.161550683 -0400
***************
*** 1 ****
--- 1,2 ----
  hello
+ 123
[root@localhost ~]# diff -u file file1
--- file 2017-04-29 21:08:28.338550683 -0400
+++ file1 2017-04-29 21:08:51.161550683 -0400
@@ -1 +1,2 @@
 hello
+123
[root@localhost ~]# diff -u file file1 > file.path
[root@localhost ~]# cat file.path 
--- file 2017-04-29 21:08:28.338550683 -0400
+++ file1 2017-04-29 21:08:51.161550683 -0400
@@ -1 +1,2 @@
 hello
+123
[root@localhost ~]# yum install patch -y
Loaded plugins: langpacks
rhel_dvd                                                 | 4.1 kB     00:00     
Resolving Dependencies
--> Running transaction check
---> Package patch.x86_64 0:2.7.1-8.el7 will be installed
--> Finished Dependency Resolution


Dependencies Resolved


================================================================================
 Package        Arch            Version                 Repository         Size
================================================================================
Installing:
 patch          x86_64          2.7.1-8.el7             rhel_dvd          110 k


Transaction Summary
================================================================================
Install  1 Package


Total download size: 110 k
Installed size: 210 k
Downloading packages:
patch-2.7.1-8.el7.x86_64.rpm                               | 110 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : patch-2.7.1-8.el7.x86_64                                     1/1 
  Verifying  : patch-2.7.1-8.el7.x86_64                                     1/1 


Installed:
  patch.x86_64 0:2.7.1-8.el7                                                    


Complete!
[root@localhost ~]# patch file file.path 
patching file file
[root@localhost ~]# cat file
hello
123
[root@localhost ~]# ls
anaconda-ks.cfg  diskpass   Downloads  file1      Music     Public     Videos
Desktop          Documents  file       file.path  Pictures  Templates
[root@localhost ~]# vim file
[root@localhost ~]# cat file
hello
[root@localhost ~]# patch -b file file.patch
patch: **** Can't open patch file file.patch : No such file or directory
[root@localhost ~]# patch -b file file.path
patching file file
[root@localhost ~]# ls
anaconda-ks.cfg  Documents  file1      Music     Templates
Desktop          Downloads  file.orig  Pictures  Videos
diskpass         file       file.path  Public
[root@localhost ~]# cat file.orig 
hello
[root@localhost ~]# cat file
hello
123
[root@localhost ~]# history
-----------------------------------------------------------------------------------------






grep 命令
• grep 将显示文件中与模式匹配的行。其也可以处理标准输入
• 模式可以包含正则表达式元字符 , 因此始终为正则表达式加引号通常被视为一种好办法。在本单元后面的部分中将介绍
-i ##执行不区分大小写搜索
-n ##前置返回行的行号
-r ##对文件执行递归式搜索,从命名目录开始
-c ##显示具有匹配模式的行的计数
-v ##返回不包含模式的行
-E ##后面可以跟正则表达式


  149  vim passwd ##太多内容了,删掉一些,再加上一些,以便于搜索做实验
  150  cat passwd
  151  grep test passwd ##在passwd中精确匹配带有test的选项
  152  grep -i test passwd ##执行不区分大小写搜索
  153  grep -i test passwd -v ##反向搜索
  154  grep -i -E "test|root" passwd ##-E后面可以跟正则表达式,此时匹配有test或者root的
  155  grep -i -E "^test|root" passwd ##行首为test的或者行中有root的
  156  grep -i -E "^test" passwd
  157  grep  test$ passwd ##行末为test的
  158  grep "test" passwd ##等于grep test passwd
  159  grep test passwd | grep -E "^test|test$" -v ##有test的行并且test不再行首或行末
  160  grep test passwd -c ##显示具有匹配模式的行的计数
  161  touch file
  162  touch file1
  163  echo westos > file1
  164  cat file1
  165  grep westos /mnt/
  166  grep westos -r /mnt/ ##对文件执行递归式搜索,从命名目录开始
  167  grep westos -r /mnt/ -n  ##-n前置返回行的行号
  168  history




---------------------------------------------------------------------------
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ls
[root@localhost mnt]# cp /etc/passwd /mnt
[root@localhost mnt]# ls
passwd
[root@localhost mnt]# vim passwd
[root@localhost mnt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
root:test:root
test:root:test
test:root:root
root:test:test
TEST:ROOT:TEST
[root@localhost mnt]# grep test passwd
root:test:root
test:root:test
test:root:root
root:test:test
[root@localhost mnt]# grep -i test passwd
root:test:root
test:root:test
test:root:root
root:test:test
TEST:ROOT:TEST
[root@localhost mnt]# grep -i test passwd -v
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost mnt]# grep -i -E "test|root" passwd
root:x:0:0:root:/root:/bin/bash
root:test:root
test:root:test
test:root:root
root:test:test
TEST:ROOT:TEST
[root@localhost mnt]# grep -i -E "^test|root" passwd
root:x:0:0:root:/root:/bin/bash
root:test:root
test:root:test
test:root:root
root:test:test
TEST:ROOT:TEST
[root@localhost mnt]# grep -i -E "^test" passwd
test:root:test
test:root:root
TEST:ROOT:TEST
[root@localhost mnt]# grep  test$ passwd
test:root:test
root:test:test
[root@localhost mnt]# grep "test" passwd
root:test:root
test:root:test
test:root:root
root:test:test
[root@localhost mnt]# grep test passwd | grep -E "^test|test$" -v
root:test:root
[root@localhost mnt]# grep test passwd -c
4
[root@localhost mnt]# touch file
[root@localhost mnt]# touch file1
[root@localhost mnt]# echo westos > file1
[root@localhost mnt]# cat file1
westos
[root@localhost mnt]# grep westos /mnt/
grep: /mnt/: Is a directory
[root@localhost mnt]# grep westos -r /mnt/
/mnt/file1:westos
[root@localhost mnt]# grep westos -r /mnt/ -n
/mnt/file1:1:westos
[root@localhost mnt]# history
-------------------------------------------------------------------------------





cut 命令
• cut 用于 “ 剪切 ” 文件中的文本字段或列并将其显示到标准输出
-d ##指定用于提取字段的分隔符(Tab时默认值)
-f ##指定要从每行中提取的字段
-c ##指定要从每行中提取的文本列


[root@localhost mnt]# history
    1  cut -d : -f 1 passwd ##以:为分隔符,提取第一字段
    2  cut -d : -f 1,7 passwd ##截取1和7部分
    3  cut -d : -f 1-3 passwd ##截取1至3部分
    4  cut -c 2-4 passwd ##截取2到4字符
    5  history
应用:----------------------------------------------------------------------------
[root@localhost mnt]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.244  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::5054:ff:fe00:2c0b  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:00:2c:0b  txqueuelen 1000  (Ethernet)
        RX packets 1350  bytes 140946 (137.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3929  bytes 247429 (241.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 2195  bytes 206440 (201.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2195  bytes 206440 (201.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


[root@localhost mnt]# 要求:只把ip地址截出来^C
[root@localhost mnt]# ifconfig eth0 |grep netmask| cut -c 14-27
172.25.254.244
[root@localhost mnt]# 但是,这种方法没有普适性^C
[root@localhost mnt]# ifconfig eth0 | grep inet | grep inet6 -v |cut -d " " -f 10
172.25.254.244
[root@localhost mnt]# 这种方法和上面那种原理一样,没有普适性。^C
[root@localhost mnt]# ifconfig eth0 | grep inet | grep inet6 -v |awk -F " " '{print $2}'
172.25.254.244
[root@localhost mnt]# 


------------------------------------------------------------------------------
[root@localhost mnt]# cut -d : -f 1 passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
test
root
test
root
TEST
[root@localhost mnt]# cut -d : -f 1,7 passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
mail:/sbin/nologin
operator:/sbin/nologin
games:/sbin/nologin
test
root
test
root
TEST
[root@localhost mnt]# cut -d : -f 1-3 passwd
root:x:0
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
sync:x:5
shutdown:x:6
halt:x:7
mail:x:8
operator:x:11
games:x:12
test:root:root
root:root:test
test:root:test
root:test:root
TEST:root:test
[root@localhost mnt]# cut -c 2-4 passwd
oot
in:
aem
dm:
p:x
ync
hut
alt
ail
per
ame
est
oot
est
oot
EST
----------------------------------------------------------------------------------





sort 命令
• sort 用于排序文本数据。该数据可以位于文件中或其他命令输出中。 Sort 通常与管道一起使用
-n ##按数值而非字符排序
-k ##设置排序字段
-t ##指定其他字段分隔符(默认为空格)






uniq 命令

uniq“ 删除 ” 文件中重复的相邻行。若要只打印文件中出现的唯一行(“ 删除 ” 所有重复行 ), 必须首先对 uniq 的输入进行排序。由于可以为uniq 指定其决策所基于的字段或列 , 因此这些字段或列是对其输入进行排序所必须的字段或列。如果未与选项一起使用 , uniq 会使用整个记录作为决策键 , 删除其输入中的重复行
-u ##仅显示唯一行
-d ##显示重复行
-c ##每行显示一次(包括出现计数)


    1  vim file
    2  cat file
    3  sort file ##按字符排序
    4  sort -n file ##按数字大小排序
    5  sort -rn file ##倒序按数字排序
    6  sort -rnu file ##-u 去掉重复值
    7  sort -rn file |uniq -c ##倒序按数字排序,且每行只显示一次(包括出现计数)
    8  sort -rn file | uniq -d ##显示出重复的行,不显示不重复的行
    9  sort -rn file | uniq -u ##仅显示唯一行
   10  vim file
   11  cat file
   12  sort file
   13  sort -n file
   14  sort -t : -k 3 -n file ##设置排序字段间隔符为:字段为3
   15  sort -t : -k 3 -n file |uniq -c
   16  history 


------以%MEM排序,显示前5个进程的PID--------------------------------------------------- 
[root@localhost mnt]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  52840  6500 ?        Ss   11:53   0:03 /usr/lib/systemd/systemd --switch
root         2  0.0  0.0      0     0 ?        S    11:53   0:00 [kthreadd]
root        17  0.0  0.0      0     0 ?        S<   11:53   0:00 [kintegrityd]
root       618  0.0  0.0  16748   992 ?        SNs  11:53   0:00 /usr/sbin/alsactl -s -n 19 -c -E 
root       620  0.0  1.1 329432 21008 ?        Ssl  11:53   0:00 /usr/bin/python -Es /usr/sbin/fir
avahi      623  0.0  0.0  30028  1484 ?        Ss   11:53   0:00 avahi-daemon: running [linux.loca
root       624  0.0  0.8 550008 15996 ?        Ssl  11:53   0:00 /usr/bin/python -Es /usr/sbin/tun
root       629  0.0  0.2 283832  4432 ?        Ssl  11:53   0:00 /usr/sbin/rsyslogd -n
root       635  0.0  0.2 209780  4368 ?        Ss   11:53   0:00 /usr/bin/abrt-watch-log -F BUG: W
libstor+   639  0.0  0.0   4336   364 ?        Ss   11:53   0:00 /usr/bin/lsmd -d
root     32294  0.0  0.0      0     0 ?        R    17:53   0:00 [kworker/0:3]
root     32370  0.0  0.0 107892   364 ?        S    17:57   0:00 sleep 60
root     32379  0.0  0.0 123356  1320 pts/0    R+   17:57   0:00 ps aux
[root@localhost mnt]# ps ax -o pid --sort -%mem |head -n 5
  PID
 2010
 1947
  737
 2066
[root@localhost mnt]# ps ax -o pid --sort -%mem |grep PID -v |head -n 5
 2010
 1947
  737
 2066
  620



---------------------------------------------------------------------------------
[root@localhost mnt]# vim file
[root@localhost mnt]# cat file
1
3
5
7
9
2
4
6
8
16
11
34
56
12
1
3
5
25
22
[root@localhost mnt]# sort file
1
1
11
12
16
2
22
25
3
3
34
4
5
5
56
6
7
8
9
[root@localhost mnt]# sort -n file
1
1
2
3
3
4
5
5
6
7
8
9
11
12
16
22
25
34
56
[root@localhost mnt]# sort -rn file
56
34
25
22
16
12
11
9
8
7
6
5
5
4
3
3
2
1
1
[root@localhost mnt]# sort -rnu file
56
34
25
22
16
12
11
9
8
7
6
5
4
3
2
1
[root@localhost mnt]# sort -rn file |uniq -c
      1 56
      1 34
      1 25
      1 22
      1 16
      1 12
      1 11
      1 9
      1 8
      1 7
      1 6
      2 5
      1 4
      2 3
      1 2
      2 1
[root@localhost mnt]# sort -rn file | uniq -d
5
3
1
[root@localhost mnt]# sort -rn file | uniq -u
56
34
25
22
16
12
11
9
8
7
6
4
2
[root@localhost mnt]# vim file
[root@localhost mnt]# cat file
44:a:1
35:a:3
2:a:5
23:a:7
5:a:9
7:a:2
5:a:4
1:a:6
9:a:8
3:a:16
3:a:11
3:a:34
3:a:56
3:a:12
23:a:1
8:a:3
6:a:5
99:a:25
8:a:22
[root@localhost mnt]# sort file
1:a:6
23:a:1
23:a:7
2:a:5
35:a:3
3:a:11
3:a:12
3:a:16
3:a:34
3:a:56
44:a:1
5:a:4
5:a:9
6:a:5
7:a:2
8:a:22
8:a:3
99:a:25
9:a:8
[root@localhost mnt]# sort -n file
1:a:6
2:a:5
3:a:11
3:a:12
3:a:16
3:a:34
3:a:56
5:a:4
5:a:9
6:a:5
7:a:2
8:a:22
8:a:3
9:a:8
23:a:1
23:a:7
35:a:3
44:a:1
99:a:25
[root@localhost mnt]# sort -t : -k 3 -n file
23:a:1
44:a:1
7:a:2
35:a:3
8:a:3
5:a:4
2:a:5
6:a:5
1:a:6
23:a:7
9:a:8
5:a:9
3:a:11
3:a:12
3:a:16
8:a:22
99:a:25
3:a:34
3:a:56
[root@localhost mnt]# sort -t : -k 3 -n file |uniq -c
      1 23:a:1
      1 44:a:1
      1 7:a:2
      1 35:a:3
      1 8:a:3
      1 5:a:4
      1 2:a:5
      1 6:a:5
      1 1:a:6
      1 23:a:7
      1 9:a:8
      1 5:a:9
      1 3:a:11
      1 3:a:12
      1 3:a:16
      1 8:a:22
      1 99:a:25
      1 3:a:34
      1 3:a:56
--------------------------------------------------------------------------------








tr 命令
• tr 用于转字符 : 即 , 如果给定了两个字符范围 , 则只要发现某个字符位于第一个范围中 , 就会将其转换为第二个范围中对等的字符。该命令通常在 shell 脚本中使用 , 以按预期情况转换数据
• tr 'A-Z' 'a-z' <file


    1  vim file
    2  cat file
    3  tr 'a-z' 'A-Z' < file
    4  tr 'A-Z' 'a-z' < file
    5  history 
-------------------------------------------------------------
[root@localhost mnt]# vim file
[root@localhost mnt]# cat file
westos
WESTOS
[root@localhost mnt]# tr 'a-z' 'A-Z' < file
WESTOS
WESTOS
[root@localhost mnt]# tr 'A-Z' 'a-z' < file
westos
westos
[root@localhost mnt]# history 
-------------------------------------------------------------








sed 命令
• sed 命令是流编辑器 , 用于对文本数据流执行编辑。假定要处理一个文件名 , sed 将对文件中的所有行执行搜索和替换 , 以将修改后的数据发送到标准输出 ; 即 , 其实际上并不修改现有文件。与 grep 一样 , sed 通常在管道中使用。
• 由于 sed 命令通常包含可以解释为 shell 元字符的字符 ,因此请按下面示例所示引用 sed 命令。默认情况下 , sed对文件中的所有行执行操作。在提供 sed 时 , 可带有地址。
s/old/new ##执行字符串转换,将old替换为new
d ##删除匹配的行


---------------------------------------------------------------------------
错误的添加用户方式:(这只是输出了,但是并没有添加用户)
[root@localhost mnt]# /mnt/file.sh 5
2
3
6
7
1
[root@localhost mnt]# cat file.sh 
#!/bin/bash
for NUM in $(seq 1 $1)
do
sed -n ${NUM}p /mnt/userfile
done
[root@localhost mnt]# cat userfile 
2
3
6
7
1
8
5
4
9
[root@localhost mnt]# 




改正后:


[root@localhost mnt]# /mnt/file.sh 2
[root@localhost mnt]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@localhost mnt]# cat file.sh 
#!/bin/bash
for NUM in $(seq 1 $1)
do
USERNAME=`sed -n ${NUM}p /mnt/userfile`
useradd $USERNAME
done
[root@localhost mnt]# id user3
id: user3: no such user
[root@localhost mnt]# cat userfile 
user1
user2
user3
[root@localhost mnt]# 


可以自动识别用户行数的


[root@localhost mnt]# vim file.sh 
[root@localhost mnt]# mv /mnt/file.sh  /bin/
[root@localhost mnt]# file.sh userfile 
useradd: user 'user1' already exists
useradd: user 'user2' already exists
[root@localhost mnt]# id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3)
[root@localhost mnt]# cat /bin/file.sh
#!/bin/bash
MAX_LINE=`wc -l $1 |awk -F " " '{print $1}'`
for NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n ${NUM}p $1`
useradd $USERNAME
done
[root@localhost mnt]# 






不太完善的加密码的


[root@localhost mnt]# vim passwd
[root@localhost mnt]# vim passwd
[root@localhost mnt]# vim userfile 
[root@localhost mnt]# vim /bin/file.sh 
[root@localhost mnt]# file.sh userfile passwd
useradd: user 'user1' already exists
Changing password for user user1.
passwd: all authentication tokens updated successfully.
useradd: user 'user2' already exists
Changing password for user user2.
passwd: all authentication tokens updated successfully.
useradd: user 'user3' already exists
Changing password for user user3.
passwd: all authentication tokens updated successfully.
Changing password for user westos1.
passwd: all authentication tokens updated successfully.
Changing password for user westos2.
passwd: all authentication tokens updated successfully.
Changing password for user westos3.
passwd: all authentication tokens updated successfully.
[root@localhost mnt]# su - student
[student@localhost ~]$ passwd user1
passwd: Only root can specify a user name.
[student@localhost ~]$ exit
logout
[root@localhost mnt]# cat /bin/file.sh 
#!/bin/bash
MAX_LINE=`wc -l $1 |awk -F " " '{print $1}'`
for NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n ${NUM}p $1`
PASSWD=$(sed -n ${NUM}p $2)
useradd $USERNAME >/dev/null
echo $PASSWD | passwd --stdin $USERNAME
done
[root@localhost mnt]# 
-------------------------------------------------------------------------






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值