4-18 Linux中搜索文件的内容 --- grep

1、grep:用于查找文件里符合条件的字符串(内容)。丰富的参数用于对搜索过程的补充。命令模式十分灵活,可以是变量、字符串、正则表达式。

2、linux 支持 grep、egrep 和 fgrep。grep 和 egrep 都支持正则表达式,只不过 egrep 支持的是扩展正则表达式。fgrep 不支持正则表达式,只支持普通字符串的过滤。

3、grep 加上相应的参数可以实现 egrep 和 fgrep 的功能。所以,也可以用 grep 加上对应的参数来执行 egrep 和 fgrep。

4、通过 man grep 查看说明。

grep、egrep、fgrep 的 功能
  • 命令格式上的 PATTERN (模式)相当于过滤条件,过滤文件中条件匹配的行。
grep 命令格式
  • grep 通过 -E 参数切换到 egrep 和 -F 参数切换到 fgrep 的功能。

5、grep 命令的基本操作:

  • ①、grep 过滤标准输入。
  • grep abc:回车之后,系统等待标准输入。abc 是过滤条件,等待后续输入内容中是否含有 abc。


    等待标准输入
输入内容含 abc 会标红显示
  • 也可以用输入重定向到标准输入,输入的内容匹配过滤条件。end 为结束符。


    输入重定向
  • 综上测试,grep 支持标准输入。也就是可以使用管道,管道右边是需要有输入功能的。 grep 更多情况下是根据文件进行操作,很多场景是配合管道执行。


②、grep 根据条件过滤文件内容。

  • 过滤 /etc/passwd 的 root 。只要 /etc/passwd 含有 root 的行都会列出来。
  • grep 可以接受变量,如上图写死了 root 作为 grep 的过滤条件,也可以用变量形式作为过滤条件。
[root@localhost ~]# echo $USER    ## USER 是一个变量,表示当前的用户名
root
[root@localhost ~]# 
[root@localhost ~]# USER=torres    ## USER 赋值为 torres
[root@localhost ~]# 
[root@localhost ~]# echo $USER    ## USER 当前值是 torres
torres

## grep 在 /etc/passwd 目录过略 USER 变量的值
[root@localhost ~]# grep $USER /etc/passwd    
torres:x:1000:1007::/home/torres:/bin/bash    ## 含有 torres 的行也会被列出来
[root@localhost ~]#
  • grep 可以调用其他命令的结果,如 whoami 本身是个命令,查询当前的用户。被调用的命令要用反单引号括起来。grep 调用 whoami 的结果,那么 whoami 要用反单引号括起来。
[root@localhost ~]# 
[root@localhost ~]# whoami    ##  whoami 是个命令,查询当前的用户
root
[root@localhost ~]# grep `whoami` /etc/passwd    ## `whoami`的结果会被 grep 调用
root:x:0:0:root:/root:/bin/bash    ## /etc/passwd 含有 root 的行都会列出来
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 


三、grep 命令的常用参数。
①、--color=auto:对匹配的字符串用高光显示。
②、-v:排除过滤条件的行,也就是显示排除条件以外的内容。
③、-i:忽略大小写。
④、-n:显示匹配的行号,列出内容的同时也列出行号。
⑤、-c:统计匹配的行数,只列出共多少行符合过略条件,不列出内容。
⑥、-o:仅显示匹配的字符串,只显示文本中含过滤条件的字符串。
⑦、-q:静默模式,不输出任何信息。用于返回值判断,不考虑输出内容。
⑧、-A:(after),显示包含当前字符串的后多少行。
⑨、-B:(before),显示包含当前字符串的前多少行。
⑩、-C:(context),显示包含当前字符串的前后多少行。
⑩-①、-e:or,或。用于多个参数间的逻辑 或 判断。
⑩-②、-w:精确匹配,匹配整个单词。
⑩-③、-f:把过滤条件放到文件中,通过读取文件的过滤条件进行过滤。
⑩-④、-E:使用 egrep。(支持扩展正则表达式)
⑩-⑤、-F:使用 fgrep(不支持正则表达式)。


  • ①、--color=auto:对匹配的字符串用高光显示。
  • grep 过滤条件匹配的内容会有标红的功能。CentOS7 系统执行 grep 的时候是执行别名。它加了一个 --color=auto 参数才支持标红。
[root@localhost ~]# alias grep    ## 列出 grep 别名
alias grep='grep --color=auto'
[root@localhost ~]# 

  • 如 grep 过滤出来的内容没有标红可以参考以下方法:
[root@localhost ~]# vim .bashrc    ## 编辑 root 家目录下的 .bashrc 文件

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias grep='grep --color=auto'    ## <---- 添加别名并输入 --color=auto 参数
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

~                                                                     
~                                                                                       
~                                                                                       
:wq    ## 保存退出     

[root@localhost ~]# source ~/.bashrc    ## .bashrc 文件生效
[root@localhost ~]#                                 

②、-v:排除过滤条件的行,也就是显示排除条件以外的内容。

  • 显示 /etc/passwd 排除了 sbin 字符串的行。
[root@localhost ~]# grep -v "sbin" /etc/passwd
root:x:0:0:root:/root:/bin/bash
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 
[root@localhost ~]# 

③、-i:忽略大小写。

## linux 大小写敏感,“Root” 和 “root” 是不一样的字符串。“Root” 不会有显示
[root@localhost ~]# grep "Root" /etc/passwd    
[root@localhost ~]# 

 ## -i 可以忽略大小写,只要是 root 这 4个字母都可以搜索出来
[root@localhost ~]# grep -i "Root" /etc/passwd   
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 

④、-n:显示匹配的行号,列出内容的同时也列出行号。

[root@localhost ~]# 
[root@localhost ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash      ## 列出行号
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 

## grep -n 和 cat -n 效果相似。(cat -n 输出结果后,管道 grep 过略 root 这个字符串)
[root@localhost ~]# cat -n /etc/passwd | grep "root"
     1  root:x:0:0:root:/root:/bin/bash
    10  operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# 

⑤、-c:统计匹配的行数,只列出共多少行符合过略条件,不列出内容。

[root@localhost ~]# 
[root@localhost ~]# grep -c "root" /etc/passwd    ## 含有 root 字符串的有 2 行
2

## grep -c 等价于 wc -l
[root@localhost ~]# grep "root" /etc/passwd | wc -l
2
[root@localhost ~]# 

⑥、-o:仅显示匹配的字符串,只显示文本中含过滤条件的字符串。

  • 文本中出现多少次 root,就会打印多少次。
[root@localhost ~]# grep -o "root" /etc/passwd
root
root
root
root
[root@localhost ~]# 

⑦、-q:静默模式,文本中包不包含过滤条件的字符串都不输出任何信息。用于返回值判断,命令执行成功返回 0,失败返回非 0。

## /etc/passwd 有 root 字符串,不会输出任何信息。
[root@localhost ~]# grep -q "root" /etc/passwd    
[root@localhost ~]# 
[root@localhost ~]# echo $?    ## 通过打印 $? 返回值是 0,命令执行成功,也就是包含 root
0

## /etc/passwd 没有 bbbbbb 字符串,也不会输出任何信息。
[root@localhost ~]# grep -q "bbbbbb" /etc/passwd
[root@localhost ~]# 
[root@localhost ~]# echo $?     ## 通过打印 $? 返回值非 0,命令执行失败,也就是没有包含 bbbbbb
1
[root@localhost ~]# 

  • -q 静默模式等价于输出重定向的 &> /dev/null(标准输出和标准错误输出重定向到垃圾桶),使用于返回值作判断。
## grep 过滤 /etc/passwd 文件中的 root 字符串,正确输出和错误输出都重定向到垃圾桶
## 执行这样的命令没有信息返回,只有执行成功与否的返回值。
[root@localhost ~]# grep "root" /etc/passwd &> /dev/null 
[root@localhost ~]# 
[root@localhost ~]# echo $?    ## /etc/passwd 中有 root 返回 0
0
[root@localhost ~]# 
[root@localhost ~]# grep "zzzzzz" /etc/passwd &> /dev/null 
[root@localhost ~]# 
[root@localhost ~]# echo $?    ## /etc/passwd 中没有 zzzzzz 返回非 0
1
[root@localhost ~]# 

  • 需要注意的是失败返回非0,不一定是 1。
[root@localhost ~]# 
[root@localhost ~]# ls cron.txt &> /dev/null 
[root@localhost ~]# 
[root@localhost ~]# echo $?    ## 当前目录有 cron.txt,返回 0
0
[root@localhost ~]# 
[root@localhost ~]# ls abc.txt &> /dev/null 
[root@localhost ~]# 
[root@localhost ~]# echo $?     ## 当前目录没有 abc.txt,返回 2(非 0)
2
[root@localhost ~]# 

⑧、-A:(after),显示包含当前字符串的后多少行。

[root@localhost ~]# grep -nA3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash    ## 含 root 的第 1 行
2-bin:x:1:1:bin:/bin:/sbin/nologin    ## 第 1 行后的 3 行显示出来
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin    ## 含 root 的第 10 行
11-games:x:12:100:games:/usr/games:/sbin/nologin    ## 第 10 行后的 3 行显示出来
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# 

⑨、-B:(before),显示包含当前字符串的前多少行。

[root@localhost ~]# 
[root@localhost ~]# grep -nB3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash    ## 当前第 1 行含 root,前面没有行可以显示
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown    ## 第 10 行前 3 行
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin    ## 第 10 行含 root
[root@localhost ~]# 

⑩、-C:(context),显示包含当前字符串的前后多少行。

[root@localhost ~]# 
[root@localhost ~]# grep -nC3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash    ## 第 1 行含有 root,只能显示后 3 行
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown    ## 第 10 行的前 3 行显示出来
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin    ## 第 10 行含有 root
11-games:x:12:100:games:/usr/games:/sbin/nologin    ## 第 10 行的后 3 行显示出来
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# 

⑩-①、-e:or,或。用于多个参数间的逻辑 或 判断。

  • 过滤 /etc/passwd 文件下含有 root 或者 bash 字符串的行。
[root@localhost ~]# 
[root@localhost ~]# grep -e "root" -e "bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash    ## 含有 root 或 bash
operator:x:11:0:operator:/root:/sbin/nologin     ## 含有 root
torres:x:1000:1007::/home/torres:/bin/bash     ## 含有 bash
user1:x:1001:1008::/home/user1:/bin/bash    ## 含有 bash
x:x:1002:1009::/home/x:/bin/bash    ## 含有 bash
[root@localhost ~]# 

  • 多重条件过略,只需多重 -e 跟过略条件即可,过滤 /etc/passwd 文件下含有 root 或者 bash 或者 nologin 字符串的行。
[root@localhost ~]# grep -e "root" -e "bash" -e "nologin" /etc/passwd
root:x:0:0:root:/root:/bin/bash     ## 含有 root 或 bash
bin:x:1:1:bin:/bin:/sbin/nologin    ## 含有 nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin    ## 含有 nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin    ## 含有 nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin    ## 含有 nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    ## 含有 nologin
operator:x:11:0:operator:/root:/sbin/nologin    ## 含有 root 或 nologin 
games:x:12:100:games:/usr/games:/sbin/nologin     ## 含有 nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin     ## 含有 nologin
nobody:x:99:99:Nobody:/:/sbin/nologin     ## 含有 nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin     ## 含有 nologin
dbus:x:81:81:System message bus:/:/sbin/nologin     ## 含有 nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin     ## 含有 nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin     ## 含有 nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin     ## 含有 nologin
torres:x:1000:1007::/home/torres:/bin/bash    ## 含有 bash
user1:x:1001:1008::/home/user1:/bin/bash    ## 含有 bash
x:x:1002:1009::/home/x:/bin/bash    ## 含有 bash
[root@localhost ~]# 

  • 多重过略条件并存,可用管道进行过滤。过滤 /etc/passwd 文件中含既有 root 也有 bash 字符串的行。
[root@localhost ~]# grep "root" /etc/passwd | grep "bash" 
root:x:0:0:root:/root:/bin/bash

⑩-②、-w:精确匹配,匹配整个单词。

  • grep "bin",语句的意思是包含 bin 的都过滤出来。会过滤很多 bin,sbin 的数据出来,因为 sbin 包含 bin。
[root@localhost ~]# 
[root@localhost ~]# grep "bin" /etc/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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 
  • 而加上 -w 参数的 grep -w "bin" ,就可以显示完全匹配单词的那些行。
[root@localhost ~]# 
[root@localhost ~]# grep -w "bin" /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 

  • -w 等价于 \b\b、\b 是边界的意思。两个 \b 括住的 bin 就是精确过滤的条件。
[root@localhost ~]# grep "\bbin\b" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 

  • -w 也等价于 <>, <>也是边界的意思。< 内容 > 是精确过滤的条件。
[root@localhost ~]# grep "\<bin\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 

  • grep 可以识别单词的分隔符:
[root@localhost ~]# echo "a abc b" | grep -w "abc"
a abc b
[root@localhost ~]# echo "a-abc-b" | grep -w "abc"
a-abc-b
[root@localhost ~]# echo "a,abc,b" | grep -w "abc"
a,abc,b
[root@localhost ~]# echo "a/abc/b" | grep -w "abc"
a/abc/b
[root@localhost ~]# echo "a\abc\b" | grep -w "abc"
a\abc\b
[root@localhost ~]# echo "a'abc'b" | grep -w "abc"
a'abc'b
[root@localhost ~]# echo "a~abc~b" | grep -w "abc"
a~abc~b
[root@localhost ~]# echo "a@abc@b" | grep -w "abc"
a@abc@b
[root@localhost ~]# echo "a%abc%b" | grep -w "abc"
a%abc%b
[root@localhost ~]# echo "a*abc*b" | grep -w "abc"
a*abc*b
[root@localhost ~]# echo "a(abc)b" | grep -w "abc"
a(abc)b
[root@localhost ~]# echo "a+abc+b" | grep -w "abc"
a+abc+b
[root@localhost ~]# echo "a>abc>b" | grep -w "abc"
a>abc>b
[root@localhost ~]# echo "a<abc<b" | grep -w "abc"
a<abc<b
[root@localhost ~]# echo "a>abc<b" | grep -w "abc"
a>abc<b
[root@localhost ~]# echo "a?abc?b" | grep -w "abc"
a?abc?b

  • grep 不能识别单词的分隔符:
[root@localhost ~]# echo "a_abc_b" | grep -w "abc"
[root@localhost ~]# echo $?    ## 返回值非 0 ,命令执行失败
1
[root@localhost ~]# echo "a1abc2b" | grep -w "abc"
[root@localhost ~]# echo $?
1
[root@localhost ~]# echo "a$abc$b" | grep -w "abc"
[root@localhost ~]# echo $?
1
[root@localhost ~]# echo "a`abc`b" | grep -w "abc"
-bash: abc: command not found
[root@localhost ~]# 

⑩-③、-f:把过滤条件放到文件中,通过读取文件的过滤条件进行过滤。

[root@localhost ~]# 
[root@localhost ~]# vim grepTest.txt    ##  编辑 grepTest.txt,存储过滤条件

root
bash
                                                                     
~                                                                                       
~                                                                                       
~                                                                                       
:wq        

[root@localhost ~]# 
[root@localhost ~]# grep -f grepTest.txt /etc/passwd    ## -f 读取 grepTest.txt 过滤条件
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
torres:x:1000:1007::/home/torres:/bin/bash
user1:x:1001:1008::/home/user1:/bin/bash
x:x:1002:1009::/home/x:/bin/bash
[root@localhost ~]# 
                  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容