Linux常用命令

man - 获得帮助

man ls  #可以通过man查看使用帮助
ls --help # 通过-h,--help 查看使用帮助

ls - 显示目录内容

ls #显示目录内容

ls -F   #查看目录中的文件

ls -l #以列表的形式显示目录内容,通常在~/.bashrc文件中增加一行:alias ll='ls -l'

ll -h #以更可读的方式显示文件大小

ll -t #以文件的修改时间顺序, 最新修改文件在最前面

ll -tr #以文件的修改时间顺序, 最新修改的在最后面

ls -a   #显示隐藏文件

ls *[0-9]*   #显示包含数字的文件名和目录名

tree         #显示文件和目录由根目录开始的树形结构(1)

lstree       #显示文件和目录由根目录开始的树形结构(2
 
watch -n 3 -dc  ls  -l #追踪目录内容的变化, 每3秒刷新一次

pwd - 显示当前目录

pwd  #显示当前目录的绝对路径

cd - 切换目录**

cd dir # 切换到目录dir

cd  #切换到用户的home目录

cd ~ #同cd

cd .. #切换到上一级目录, 一个点表示当前目录, 两个点.. 表示上一级目录

cd ../..    #返回上两级目录

cd - # 切换到进入当前目录之前所在的目录

mkdir - 创建目录

mkdir dir # 创建dir目录

mkdir dir1 dir2    #同时创建两个目录

mkdir -p dir1/dir2  # 递归创建目录, 如dir1不存在, 会先创建dir1

cat -合并文件(按行)

cat file # 合并一个或多个文件至标准输出, 当只有一个文件时, 相当于显示所有文件内容

cat file1 file2  #合并file1和file2的内容, 并在屏幕上输出

cat  rq1.gz rq2.gz #可以合并gzip压缩文件, 如测序数据原始reads的合并

paste - 合并文件(按列)

paste -d ' ' file1 file2    # 按列对列的方式一行一行合并文件。默认列中间加TAB键, -d参数可以改变列之间的分隔符

split - 分割文件

split -d -l 10000 file chunk_   # 按行数分割文件,每个文件最多10000行,分割成的文件名为chunk_01, chunk_02。。。

split -d -b 100m file chunk_    # 按大小分割文件,每个文件最多100m,分割成的文件名为chunk_01, chunk_02。。。

cut - 剪切文件

cut -f 1 file                   # 剪切文件的第1列

cut -f 1,2                      # 剪切文件的第1,2列

cut -f 3-                       # 剪切第3列及之后的所有列

cut -d ' ' -f 1 file            # 剪切第1列,但以空格作为列与列之间的分隔符。默认以TAB作为分隔符

grep '^>' test.fa | cut -c 2-   # 得到fasta文件中的序列名称(去掉了>符号)

less, head, tail - 显示文件内容

less file       # 分屏显示文件内容,按空格键显示下一页,按下/后可以搜索内容
# 浏览模式快捷键
    ↑ #上一行
    ↓ #下一行
    G #最后一页
    g #第一页
    空格 #下一页
    /关键词 #搜索关键词
# 退出浏览模式,回到Linux命令行模式
    q #退出

less -SN file   # 显示文件的行号,并且截断太长的行 

head file       # 默认显示文件前10行

head -n 20 file # 显示文件前20行

tail file       # 默认显示文件后10行

tail -n 20 file # 显示文件后20行

tail -n +2 file # 跳过第1行,显示从第2行开始的所有行,可用于跳过文件的标题行

tail -f file    # 当文件的内容还在增加时,实时显示末尾增加的内容,常用于查看日志文件的更新情况

wc - 统计文件内容

wc -l file      # 统计文件行数

touch - 创建文件

touch file                  # 创建一个空文件

touch {file1,file2,file3}   # 同时创建3个文件

cp, mv, rm- 文件/目录的复制,移动,删除

scp file1 file2     # 将file1复制一份,命名为file2,复制目录要加-r参数:scp -r

cp file1 file2     #复制一个文件

cp dir/* .         #复制一个目录下的所有文件到当前工作目录

cp -a /tmp/dir1 .   #复制一个目录到当前工作目录,相当于将原数据原封不动的拷贝过来,不改变里面的任何信息

cp -a dir1 dir2     #复制一个目录 相当于将原数据原封不动的拷贝过来,不改变里面的任何信息

cp -r dirold dirnew  #拷贝文件夹 拷贝的结果是生成新的时间戳等信息
mv file1 dir1/      # 将file1移动到dir1/目录下

mv file1 file2      # 重命名:即将file1移动成为file2

rm -f file1    #删除一个叫做 'file1' 的文件'

rmdir dir1     #删除一个叫做 'dir1' 的目录'

rm -rf dir1    #删除一个叫做 'dir1' 的目录并同时删除其内容

rm -rf dir1 dir2    #同时删除两个目录及它们的内容

rm file             # 删除文件,删除目录要加-r参数:rm -r

rm -f file          # 文件若不存在,删除时会报错,加-f参数就不会报错

rm -rf file

tar - 文件打包/压缩

# 平时tar基本上就能完成打包、压缩、解压的任务了


bunzip2 file1.bz2   #解压一个叫做 'file1.bz2'的文件

bzip2 file1         #压缩一个叫做 'file1' 的文件

gunzip file1.gz     #解压一个叫做 'file1.gz'的文件

gzip file1          #压缩一个叫做 'file1'的文件

gzip -9 file1       #最大程度压缩



rar a file1.rar test_file          #创建一个叫做 'file1.rar' 的包

rar a file1.rar file1 file2 dir1   #同时压缩 'file1', 'file2' 以及目录 'dir1'

rar x file1.rar     #解压rar包

unrar x file1.rar   #解压rar包



tar -cvf archive.tar file1   #创建一个非压缩的 tarball

tar -cvf archive.tar file1 file2 dir1  #创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件

tar -tf archive.tar    #显示一个包中的内容

tar -xvf archive.tar   #释放一个包

tar -xvf archive.tar -C /tmp     #将压缩包释放到 /tmp目录下

tar -cvfj archive.tar.bz2 dir1   #创建一个bzip2格式的压缩包

tar -jxvf archive.tar.bz2        #解压一个bzip2格式的压缩包

tar -cvfz archive.tar.gz dir1    #创建一个gzip格式的压缩包

tar czvf file.tar.gz files  # 打包并压缩

tar -zxvf archive.tar.gz         #解压一个gzip格式的压缩包

tar xvf file.tar.gz         # 解包,解压缩

#压缩语法:tar -zcvf 压缩后文件名 被压缩文件
#解压缩语法 tar -zxvf 压缩文件名 -C 解压后文件所在目录
#参数1:
#参数 描述
# -z    操作tar.gz文件需要使用
#-x 解压缩
#-c 压缩
#-v 显示压缩或者解压缩的执行过程信息
#-f 要处理的文件file,必须放在最后
#参数2:-C 指定解压后的文件存放的位置


zip file1.zip file1    #创建一个zip格式的压缩包

zip -r file1.zip file1 file2 dir1    #将几个文件和目录同时压缩成一个zip格式的压缩包

unzip file1.zip    #解压一个zip格式压缩包






文件的权限 改变文件/目录权限

使用 "+" 设置权限,使用 "-" 用于取消

ls -lh    #显示权限

ls /tmp | pr -T5 -W$COLUMNS   #将终端划分成5栏显示

chmod ugo+rwx directory1      #设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限

chmod go-rwx directory1      #删除群组(g)与其他人(o)对目录的读写执行权限

chown user1 file1            #改变一个文件的所有人属性

chown -R user1 directory1    #改变一个目录的所有人属性并同时改变改目录下所有文件的属性

chgrp group1 file1          #改变文件的群组

chown user1:group1 file1     #改变一个文件的所有人和群组属性

find / -perm -u+s           #罗列一个系统中所有使用了SUID控制的文件

chmod u+s /bin/file1        #设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限

chmod u-s /bin/file1        #禁用一个二进制文件的 SUID位

chmod g+s /home/public      #设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的

chmod g-s /home/public      #禁用一个目录的 SGID 位

chmod o+t /home/public      #设置一个文件的 STIKY 位 - 只允许合法所有人删除文件

chmod o-t /home/public      #禁用一个目录的 STIKY 位

chmod +x file   # 增加[本人]可执行权限

chmod -x file   # 取消[本人]可执行权限

chmod a+x file  # 增加[所有人]可执行权限

chmod a-x file  # 取消[所有人]可执行权限

sort, uniq - 排序,去重

sort file               # 默认按字典序对文件进行排序

sort -k2,2 -k3,3 file   # 先按第2列排序,第2列相同,再按第3列排序

sort -k2,2n file        # 按第2列排序,且第2列是数字,升序

sort -k2,2nr file       # 按第2列排序,且第2列是数字,降序

sort -u file            # 先排序文件,然后去除相邻的重复行,只保留一条记录

sort file | uniq        # 去除相信的重复行,只保留一条记录,相当于: sort -u file

# 利用sort, uniq取两个文件的交、并、补集
sort a b | uniq         # 并集

sort a b | uniq -d > c  # 交集

sort a c | uniq -u      # 补集

wget - 下载文件

wget https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh    # 下载文件到当前目录,文件名保持不变

top, htop, ps, kill - 任务管理

top -c      # 查看CPU,内存的使用情况
# 实时查看系统进程
    top
    # 快捷键
        ↑ 下翻
        ↓ 上翻
        q 退出

htop        # top的完美替代品,Linux系统不自带,需要安装, ubuntu系统:apt install htop

ps aut      # 查看后台任务运行情况,第2列是任务的PID号

kill -9 PID # 删除编号为PID的任务

killall -9 bwa  # 删除所有名称为 bwa 的任务

killall -u username # 删除用户 username 的所有任务

find, locate, which - 文件查找

find / -name file1     #从 '/' 开始进入根文件系统搜索文件和目录

find dir/ -name file            # 在dir/目录下查找名为file的文件

find dir/ -name '*file*'        # 在dir/目录下查找包含file关键词的文件,-name参数支持正则表达式

find dir/ -name file -delete    # 查找文件并删除

find / -user user1     #搜索属于用户 'user1' 的文件和目录

find /home/user1 -name \*.bin        #在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件

find /usr/bin -type f -atime +100    #搜索在过去100天内未被使用过的执行文件

find /usr/bin -type f -mtime -10     #搜索在10天内被创建或者修改过的文件

find / -name \*.rpm -exec chmod 755 '{}' \;      #搜索以 '.rpm' 结尾的文件并定义其权限

find / -xdev -name \*.rpm        #搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备

whereis halt       #显示一个二进制文件、源码或man的位置

which halt         #显示一个二进制文件或可执行文件的完整路径

which command                   # 显示命令的绝对路径

locate \*.ps       #寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令

locate file                     # 查找文件

ssh - 远程登录

ssh username@host                    # ssh 远程连接至服务器

scp - 远程文件传输

scp username@host:/path/to/file .    # 将远程服务器上的文件传输到当前目录,文件名保持不变,复制目录加参数-r

scp file username@host:/path/to/dir/ # 将本地文件复制到远程服务器,文件名保持不变,复制目录加参数-r

rsync - 远程文件拷贝

rsync与scp不同,它只是做增量更新且支持断点续传,也就是要复制的文件存在于目标文件夹且内容与当前要复制的相同,则不会复制。

rsync -azvP dir1 dir2                   # 将dir1的内容同步至dir2

rsync -azvP --delete dir1 dir2          # 同步dir2与dir1,dir1中删除的文件,dir2中也要跟着删除

rsync -azvP --exclude 'file' dir1 dir2  # 同步dir2与dir2,且将file排除在外

df, du, free - 查看磁盘/内存使用情况

df -h       # 查看磁盘使用情况,-h表示以人类可读的方式显示容量大小

du -sh      # 查看当前目录使用了多少磁盘空间

du -sh *    # 查看当前目录下各文件或文件夹使用的磁盘空间

free -h     # 查看内存使用情况

grep

用于查找文件里符合条件的字符串。

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

grep pattern files           # 搜索文件中包含pattern的行

grep -v pattern files        # 搜索文件中不包含pattern的行

grep -f pattern.txt files    # 搜索的pattern来自于文件中

grep -i pattern files        # 不区分大小写。默认搜索是区分大小写的
grep -i pattern files        # 只匹配整个单词,而不是字符串的一部分(如搜索hello,不会匹配到helloworld)
grep -n pattern files        # 显示行号信息
grep -c pattern files        # 显示匹配的行数
grep -l pattern files        # 只显示匹配的文件名
grep -L pattern files        # 显示不匹配的文件名
grep -C number pattern files     # 额外显示匹配行的上下[number]行
grep pattern1 | grep pattern2 files     # 显示既匹配pattern1,又匹配pattern2的行
grep -E "pattern1|pattern2" files   # 显示匹配pattern1或者pattern2的行, grep -E相当于egrep

# 用于搜索的特殊字符
^: 表示行前
$: 表示行尾

grep '^#' result.vcf        # 显示VCF文件的表头信息
grep '^hello$' files        # 显示只包含hello的行
grep -v '^\s*$' file        # 删除空白行

文本处理

cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT


cat file1 | command( sed, grep, awk, grep, etc...) > result.txt  #合并一个文件的详细说明文本,并将简介写入一个新文件中

cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt #合并一个文件的详细说明文本,并将简介写入一个已有的文件中



grep Aug /var/log/messages     #在文件 '/var/log/messages'中查找关键词"Aug"

grep ^Aug /var/log/messages    #在文件 '/var/log/messages'中查找以"Aug"开始的词汇

grep [0-9] /var/log/messages   #选择 '/var/log/messages' 文件中所有包含数字的行

grep Aug -R /var/log/*         #在目录 '/var/log' 及随后的目录中搜索字符串"Aug"



sed 's/stringa1/stringa2/g' example.txt #将example.txt文件中的 "string1" 替换成 "string2"

sed '/^$/d' example.txt           #从example.txt文件中删除所有空白行

sed '/ *#/d; /^$/d' example.txt   #从example.txt文件中删除所有注释和空白行

echo 'esempio' | tr '[:lower:]' '[:upper:]'    #合并上下单元格内容

sed -e '1d' result.txt          #从文件example.txt 中排除第一行

sed -n '/stringa1/p'            #查看只包含词汇 "string1"的行

sed -e 's/ *$//' example.txt    #删除每一行最后的空白字符

sed -e 's/stringa1//g' example.txt  #从文档中只删除词汇 "string1" 并保留剩余全部

sed -n '1,5p;5q' example.txt     #查看从第一行到第5行内容

sed -n '5p;5q' example.txt       #查看第5行

sed -e 's/00*/0/g' example.txt   #用单个零替换多个零



cat -n file1       #标示文件的行数

cat example.txt | awk 'NR%2==1'      #删除example.txt文件中的所有偶数行

echo a b c | awk '{print $1}'        #查看一行第一栏

echo a b c | awk '{print $1,$3}'     #查看一行的第一和第三栏

paste file1 file2           #合并两个文件或两栏的内容

paste -d '+' file1 file2    #合并两个文件或两栏的内容,中间用"+"区分


sort file1 file2              #排序两个文件的内容

sort file1 file2 | uniq       #取出两个文件的并集(重复的行只保留一份)

sort file1 file2 | uniq -u    #删除交集,留下其他的行

sort file1 file2 | uniq -d    #取出两个文件的交集(只留下同时存在于两个文件中的文件)



comm -1 file1 file2    #比较两个文件的内容只删除 'file1' 所包含的内容

comm -2 file1 file2    #比较两个文件的内容只删除 'file2' 所包含的内容

comm -3 file1 file2    #比较两个文件的内容只删除两个文件共有的部分

sed

sed是stream editor的缩写,中文称之为“流编辑器”。

sed command file
  • command部分,针对每行要进行的处理
  • file,要处理的文件

Actions

  • d:删除该行
  • p:打印该行
  • i:在行的前面插入新行
  • a:在行的后面插入新行
  • r:读取指定文件的内容。
  • w:写入指定文件。
sed -n '10p' file       # 显示第10行
sed -n '10,20p' file    # 显示第10到20之间的行
sed -n '/pattern/p' file# 显示含有pattern的行
sed -n '/pattern1/,/pattern2/p' file # 显示patter1与pattern2之间的行

sed '10d' file          # 删除第10行
sed '10,20d' file       # 删除第10到20之间的行
sed '/pattern/d'        # 删除匹配pattern的行
sed '/^\s*$/d' file     # 删除空白行
sed 's/^\s*//' file     # 删除行前的空白:空格,制表符
sed 's/\s*$//' file     # 删除行尾的空白:空格,制表符
sed 's/^\s*//;s/\s*$//' file # 删除行首和行尾的空白:空格,制表符

sed 's/AA/BB/' file     # 将文件中的AA替换成BB,只替换一行中第一次出现的AA,替换后的结果输出到屏幕
sed 's/AA/BB/g' file    # 将文件中的所有AA都替换成BB,替换后的结果输出到屏幕
sed -i 's/AA/BB/g' file # 将文件中的所有AA都替换成BB,直接更改文件的内容
sed '/CC/s/AA/BB/g' file# 只替换那些含有CC的行
sed 's/pattern/&XXXX/' file # 在pattern之后加上XXXX。&表示之前被匹配的内容
sed 's/pattern.*/&XXXX' file# 在匹配pattern的行尾加上XXXX。pattern.*表示包含pattern的整行内容

sed -n '1~4s/^@/>/p;2~4p' file.fq > file.fa # Fastq文件转Fasta文件
sed -n '2~4p' file.fq       # 提取Fastq文件的序列

sed 'y/ABC/XYZ/' file   # 将ABC逐字替换成XYZ

sed '1i\hello' file     # 在第1行前面插入一行,内容为hello,通常用来为文件增加标题
sed '1a\hello' file     # 在第1行后面插入一行,内容为hello
sed '1r file2' file1    # 在第1行后面读入file2的内容
sed '/pattern/w file2' file1 # 将匹配的行写入file2中

用户和群组

groupadd group_name   #创建一个新用户组

groupdel group_name   #删除一个用户组

groupmod -n new_group_name old_group_name   #重命名一个用户组

useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1     #创建一个属于 "admin" 用户组的用户

useradd user1      #创建一个新用户

userdel -r user1   #删除一个用户 ( '-r' 排除主目录)

usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1   #修改用户属性


passwd         #修改口令

passwd user1   #修改一个用户的口令 (只允许root执行)

chage -E 2005-12-31 user1    #设置用户口令的失效期限

pwck     #检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户

grpck    #检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组

newgrp group_name     #登陆进一个新的群组以改变新创建文件的预设群组

JPS

jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.
$> jps
23991 Jps
23789 TimorMain
23651 Demo

比较常用的参数:

#-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
$> jps -q
28680
23789
23651

#-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
$> jps -m
28715 Jps -m
23789 TimorMain
23651 Demo -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/timor/log/stderr.log

#-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
$> jps -l
28729 sun.tools.jps.Jps
23789 com.timor.TimorMain
23651 com.timor.cn.Demo

#-v 输出传递给JVM的参数
$> jps -v


23789 TimorMain

28802 Jps -Denv.class.path=/data/timor/cn/twsecurity/java/trustwork140.jar:/data/timor/cn/twsecurity/java/:/data/timor/cn/twsecurity/java/twcmcc.jar:/data/timor/jdk15/lib/rt.jar:/data/timor/jd

k15/lib/tools.jar -Dapplication.home=/data/timor/jdk15 -Xms8m

23651 Resin -Xss1m -Dresin.home=/data/timor/resin -Dserver.root=/data/timor/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -

Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl


jps 192.168.1.200
#列出远程服务器192.168.1.200机器所有的jvm实例,采用rmi协议,默认连接端口为1099(前提是远程服务器提供jstatd服务)

#注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容