版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ARPOSPF/article/details/84826979
Linux操作系统常用命令
LInux基本命令
- ~:代表当前用户所在的home目录。如:/home/zhangsan
- $:用来只是普通用户输入命令的地方;对于root用户来说一般是‘#’
- cat:查看文件,与‘<<END’连用可以用于输入大段数据
- >:重定向符号,即把前面命令的输出写入到‘>’后面的文件中。
- ls -l:列出文件的详细信息,还可加上-h参数,方便读取文件大小
- man ls:查看ls所有的命令行参数,上下箭头翻页,q退出查看
- cd:切换目录
- head:查看文件最开始的几行,默认是10行,可以使用-n 30指定查看前30行
- less,more也可以查看文件,尤其是文件内容特别多的时候
- tac:文件翻转
- rev:每列反转
Linux文件操作
- nano:创建、编辑文件,类似于记事本。nano filename新建一个文件,并在里面写内容;ctrl+x退出,根据提示按Y保存
- vim:强大的文本编辑器。vim filename 新建一个文件,按i进入写作模式。写完后,按ESC,退出写作模式,输入:wq,保存退出
- cp:拷贝文件或目录(cp -r拷贝文件夹时的参数,递归拷贝)
- mv:移动或重命名文件或目录
- rename:文件重命名(常用于批量重命名,不同的系统可能用法略有不同,使用前先
man rename
查看使用方法) - ln: 给文件建立快捷方式 (
ln -s source_file target
创建软连接)- 在建立软连接时,源文件要使用绝对路径
- 建立软连接是为了在不增加磁盘存储的情况下,简化文件访问的一种方式
- ../:表示上一层目录;../../:表示上面两层目录
- ·:为键盘ESC下的第一个键,又名反引号键,写在反引号内的命令会被运行,运行结果会放置在反引号所在的位置
Linux文件内容操作
- gzip:压缩文件;gunzip:解压缩文件,gzip -c 表示把压缩的文件输出到标准输出(一般是屏幕)
- wc:word count,一般使用wc -l获取文件的行数
- grep:print lines matching a pattern,获取符合要求的行数或文件内容,支持正则表达式匹配,添加'-v'表示不输出匹配的行
- sed:替换文件中的字符,是一个功能强大的文件内容编辑工具,常用于替换,获取行号等操作。
# 第一个错误,漏掉了文件名
# 程序静止在这,等待用户的进一步输入
# ctrl+c杀掉当前命令
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' | tail -n 3
^C
# 第二个错误,文件名和单引号之间没有空格,使得sed判断命令错误
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//'ehbio.fa | tail -n 3
sed:-e 表达式 #1,字符 11:“s”的未知选项
# 正确操作,
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
- 另外一个方式,去除
HAHA
,使用cut
命令 (cut更适合与矩阵操作,去除其中的一列或者多列)。- -f:指定取出哪一列,使用方法为
-f 2
(取出第2列),-f 2-5
(取出第2-5列),-f 2,5
(取出第2和第5列)。 - -d:设定分隔符, 默认为TAB键。如果一行没有指定的分隔符,整行都为第一列。
- -f:指定取出哪一列,使用方法为
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
Linux的标准输入、输出、重定向、管道操作
- 默认Linux的命令的结果都是输出到标准输出,错误信息 (比如命令未找到或文件格式识别错误等) 输出到标准错误,而标准输出和标准错误默认都会显示到屏幕上。
- >:表示重定向标准输出,> filename就是把标准输出存储到文件filename里。标准错误还是会显示在屏幕上
- 2 >&1:表示把标准错误重定向到标准输出。Linux终端用2表示标准错误,1表示标准输出
- -:短横线,表示标准输入,一般用于1个程序需要多个输入的时候
- <:标准输入,后面可以跟产生输出的命令,一般用于1个程序需要多次输入的时候。
- |:管道符,表示把前一个命令的输出作为后一个命令的输入,用于数据在不同的命令之间传输,减少磁盘存取损耗。
- tr:用于替换字符
- diff:用于比较2个文件的差异,需要两个参数
# 管道符的使用
# 第一个命令的输出作为第二个的输入
# 前面的例子中也有使用
# tr: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3
# cat命令之前也用过,输出一段文字
# diff是比较2个文件的差异的,需要2个参数
# - (短横线)表示上一个命令的输出,传递给diff
# < 表示其后的命令的输出,也重定向给diff
ct@ehbio:~$ cat <<END | diff - <(echo "1 2 3" | tr ' ' '\n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4
# 如果不使用管道和重定向标准输入,程序是这么写的
# 先把第一部分存储为1个文件
ct@ehbio:~$ cat <<END >firstfile
2
3
> 4
> END
ct@ehbio:~$ less firstfile
# 再把第二部分存储为1个文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n' >secondfile
# 然后比较
ct@ehbio:~$ diff firstfile secondfile
0a1
> 1
3d3
< 4
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' '\n' | wc -l
3
# sed =:先输出行号,再输出每行的内容
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed =
1
a
2
b
3
c
# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把换行符替换为\t
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/\n/\t/'
1 a
2 b
3 c
# 后面这个命令不太好解释
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
a
>2
b
>3
c
# 把多条序列转成FATSA格式
# sed = 同时输出行号
# N: 表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
# 于是FASTA格式序列就出来了
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
actg
>2
aaaaa
>3
cccccg
Linux的常见错误和快捷操作
- 常见错误
- 命令不全:在命令没有输入完整后就按下Enter键,终端会提示出一个>,以示继续输入,也可以ctrl+c终止输入,重新编辑
- 文件名输入错误:多一个字母,少一个字母,大小写的问题
- 所在目录不对:访问的目录不存在于当前目录,而又没有提供绝对路径,或软连接失效
- 快捷操作
- 命令或文件名自动补全:在输入命令或文件名的前几个字母后,按Tab键,系统会自动补全或提示补全
- 上下箭头:可以回溯之前的命令,增加命令的重用
- !加之前输入过的命令的前几个字母,快速获取前面的命令
- ctrl+a:回到命令的行首,用于修改常用命令或注释掉命令
- !!:表示上一条命令
- 替换上一个命令中的字符,再运行一遍命令,用于需要对多个文件执行同样的命令,又不想写循环的情况
# 输入一个命令
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4
# !!表示上一条命令
# :gs表示替换,把上一个命令中全部的ehbio替换为ehbio3; g: global; s: substitute
ct@ehbio:~/ehbio_project$ !!:gs/ehbio/ehbio3
#cut -f 1 -d ' ' ehbio3.fa | tail -n 4
# 替换后效果如上
# 去掉命令前的#号
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio3.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
## 替换ehbio3为ehbio4,直接运行命令
ct@ehbio:~/ehbio_project$ !!:gs/ehbio3/ehbio4
cut -f 1 -d ' ' ehbio4.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
Linux的环境变量和权限管理
Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件。前面所提到的这些命令,都具有可执行属性。
- which:表示查看命令的路径。一般用于当我们想知道使用的命令来源于什么地方时。
- 文件属性
rwx
中r
表示read
(数字表示为4)、w
表示write
(数字表示为2)、x
表示执行 (数字表示为1)。三个为一组,连续出现三次(如下面命令行中所示), 第一组表示文件的所有者拥有的权限,第二组为文件所有者所在的用户组所拥有的权限,组内所有成员都具有的权限,第三组为其它用户的权限。chmod a+x file
: 表示给文件增加所有人(a)可执行权限 (+x)chmod u+x file
: 表示给文件增加所有者(u,user,)可执行权限 (+x)chmod g+x
,chmod o+X
: 表示给文件增加组内人或其它人可执行权限chmod 755 file
: 表示拥有者有可读写执行权限,其它人有可读执行权限。(7=4+2+1
;5=4+1
)
- 环境变量:通俗的讲,环境变量就是告诉电脑 (实际是操作系统)几个目录。这几个目录下存储有可执行文件,如前面显示的
/usr/bin
目录,大部分的系统命令都在这个目录下。- 系统中环境变量的名字是
PATH
,其内容可通过下面的命令显示 (根据操作系统不同和配置不同,略有差别,但格式是统一的,:
分割的一堆路径):
- 系统中环境变量的名字是
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
- 如果我们想让自己的命令能被系统找到,就需要把命令所在的目录加到环境变量里面,怎么操作呢?加到环境变量的路径必须是全路径,全路径指以
/
开头或已~
开头的路径。 - 对于普通用户,在远程登录终端时,home目录下的
~/.bash_profile
(不是~/.bashrc
)会自动被读取,所以需要把export
语句加入到这个文件中。 - 系统查找命令的顺序是从环境变量的第一个目录到最后一个目录,在第一次碰到查询的命令后,就调用执行。假如系统存在一个
python
命令,我们自己又安装了一个python
(假如在/home/ct/anaconda/bin目录下),如果我们想执行自己的python
程序,就需要把/home/ct/anaconda/bin
写在$PATH
前面,如下
# 注意$PATH的顺序
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ export PATH=/home/ct/anaconda/bin:$PATH
PATH
只是众多环境变量中的一个变量,用于存储可执行文件所在的目录,以便在用户输入命令时可以查询的到。尤其是自己写的脚本或安装的程序,系统不会知道它们在哪个路径下,需要我们去提供给系统这些新的路径,学名叫设置环境变量。- 常用到的环境变量还有
LD_LIBARY_PATH
: 指定动态链接库 (so文件)的位置,一般在安装软件出错时会用到;PYTHONPATH
: 指定Python的安装包的路径;PERL5LIB
: 指定perl的安装包的路径。 - 设置环境变量要注意2点:
- 1. 设置新的环境变量时一般要包含原始的环境变量,不能覆盖;
- 2. 注意自己的目录和系统环境变量的目录的顺序,想让哪个先被找到,就先放哪个。
Linux的文件排序
- seq:产生一系列的数组;man seq查看其具体使用
- sort:排序,默认按字符编码排序。如果想按数字大小排序,需添加-n参数
sort -u
: 去除重复的行,等同于sort | uniq
。- sort file | uniq -d:获得重复的行。(d=duplication)
- sort file | uniq -c:获得每行重复的次数
- awk:是一个强大的文本处理工具,其处理数据模式为按行处理。每次读入一行,进行操作。
OFS
: 输出文件的列分隔符 (output file column separtor);FS
为输入文件的列分隔符 (默认为空白字符)。awk
中的列从第1到n列,分别记录为$1
,$2
…$n
。BEGIN
表示在文件读取前先设置基本参数;与之相对应的是END
,只文件读取完成之后进行操作。不以BEGIN
,END
开头的{}
就是文件读取、处理的部分。 sed
和tr
都为最常用的字符替换工具
Linux服务器数据定期同步和备份方式
- 最简单的备份方式,就是使用
cp
(本地硬盘)或scp
(远程硬盘)命令,给自己的结果文件新建一个拷贝;每有更新,再拷贝一份。 - 为了实现定期备份,可以把上述命令写入
crontab
程序中,设置每天的晚上23:00执行。对于远程服务器的备份,可以配置免密码登录,便于自动备份。后台输入免密码登录服务器,获取免密码登录服务器的方法。
# Crontab format
# Minute Hour Day Month Week command
# * 表示每分/时/天/月/周
# 每天23:00 执行cp命令
0 23 * * * cp -fur source_project project_bak
# */2 表示每隔2分分/时/天/月/周执行命令
# 每隔24小时执行cp命令
0 */24 * * * cp -fur source_project project_bak
0 0 */1 * * scp -r source_project user@remote_server_ip:project_bak
# 另外crotab还有个特殊的时间
# @reboot: 开机运行指定命令
@reboot cmd
rsync:
是一个增量备份工具,只针对修改过的文件的修改过的部分进行同步备份,大大缩短了传输的文件的数量和传输时间。rsync
所做的工作为镜像,保证远端服务器与本地文件的统一。如果本地文件没问题,远端也不会有问题。但如果发生误删或因程序运行错误,导致文件出问题,而在同步之前又没有意识到的话,远端的备份也就没了备份的意义,因为它也被损坏了。误删是比较容易发现的,可以及时矫正。但程序运行出问题,则不一定了。具体使用如下 :
# 把本地project目录下的东西备份到远程服务器的/backup/project目录下
# 注意第一个project后面的反斜线,表示拷贝目录内的内容,不在目标目录新建project文件夹。注意与第二个命令的比较,两者实现同样的功能。
# -a: archive mode, quals -rlptgoD
# -r: 递归同步
# -p: 同步时保留原文件的权限设置
# -u: 若文件在远端做过更新,则不同步,避免覆盖远端的修改
# -L: 同步符号链接链接的文件,防止在远程服务器出现文件路径等不匹配导致的软连接失效
# -t: 保留修改时间
# -v: 显示更新信息
# -z: 传输过程中压缩文件,对于传输速度慢时适用
rsync -aruLptvz --delete project/ user@remoteServer:/backup/project
rsync -aruLptvz --delete project user@remoteServer:/backup/
rdiff-backup:
不只可以做增量备份,而且会保留每次备份的状态,新备份和上一次备份的差别,可以轻松回到之前的某个版本。唯一的要求就是,本地服务器和远端服务器需要安装统一版本的rdiff-backup
。另外还有2款工具duplicity
和`Rsnapshot
也可以做类似工作,但方法不一样,占用的磁盘空间也不一样,具体可查看原文链接中的比较。具体的rdiff-backup
安装和使用如下:
1.Install rdiff-backup
at both local and remote computers
# 1.Install requirements
#install for ubuntu, debian
sudo apt-get install python-dev librsync-dev
#self compile
#downlaod rsync-dev from https://sourceforge.net/project/showfiles.php?group_id=56125
tar xvzf librsync-0.9.7.tar.gz
export CFLAGS="$CFLAGS -fPIC"
./configure --prefix=/home/user/rsync --with-pic
make
make install
# 2.Install rdiff-backup
#See Reference part for download link
# http://www.nongnu.org/rdiff-backup/
python setup.py install --prefix=/home/user/rdiff-backup
#If you complied rsync-dev yourself, please specify the location of rsync-dev
python setup.py --librsync-dir=/home/user/rsync install -- prefix=/home/user/rdiff-backup
# 3.Add exeutable files and python modules to environmental variables
#Add the following words into .bashrc or .bash_profile or any other config files
export PATH=${PATH}:/home/user/rdiff-backup/bin
export PYTHONPATH=${PYTHONPATH}:/home/user/rdiff-backup/lib/python2.x/site-packages
#pay attention to the x in python2.x of above line which can be 6 or 7 depending on
#the Python version used.
# 4.Test environmental variable when executing commands through ssh
ssh user@host 'echo ${PATH}' #When I run this command in my local computer,
#I found only system environmetal variable is used
#and none of my self-defined environmetal variable is used.
#Then, I modified the following lines in file 'SetConnections.py' in
#/home/user/rdiff-backup/lib/python2.x/site-packages/rdiff_backup
#to set environmental explicitly when login.
#pay attention to the single quote used inside double quote
__cmd_schema = "ssh -C %s 'source ~/.bash_profile; rdiff-backup --server'"
__cmd_schema_no_compress = "ssh %s 'source ~/.bash_profile; rdiff-backup --server'"
#choose the one contains environmental variable for rdiff-backup from .bash_profile and .bashrc.
2.Use rdiff-backup
- Start backup
rdiff-backup --no-compression --print-statistics user@host::/home/user/source_dir destination_dir
- If the
destination_dir
exists, please add--force
likerdiff-backup --no-compression --force --print-statistics user@host::/home/user/source_dir destination_dir
. All things in originaldestination_dir
will be depleted. - If you want to exclude or include special files or dirs please specify like
--exclude '**trash'
or--include /home/user/source_dir/important
.
- Timely backup your data
- Add the above command into
crontab (hit 'crontab -e' in terminal to open crontab)
in the format like5 22 */1 * * command
which means executing thecommand
at 22:05 everyday.
- Add the above command into
- Restore data
- Restore the latest data by running
rdiff-backup -r now destination_dir user@host::/home/user/source_dir.restore
. Add--force
if you want to restore tosource_dir
. - Restore files 10 days ago by running
rdiff-backup -r 10D destination_dir user@host::/home/user/source_dir.restore
. Other acceptable time formats include 5m4s (5 minutes 4 seconds) and 2014-01-01 (January 1st, 2014). - Restore files from an increment file by running
rdiff-backup destination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing user@host::/home/user/source_dir.restore/server_add
. Increment files are stored indestination_dir/rdiff-backup-data/increments/server_add.2014-02-21T09:22:45+08:00.missing
.
- Restore the latest data by running
Remove older records to save space- Deletes all information concerning file versions which have not been current for 2 weeks by running
rdiff-backup --remove-older-than 2W --force destination_dir
. Note that an existing file which has not changed for a year will still be preserved. But a file which was deleted 15 days ago can not be restored after this command. Normally one should use--force
since it is used to delete multiple increments at the same time which--remove-older-than
refuses to do by default. - Only keeps the last n rdiff-backup sessions by running
rdiff-backup --remove-older-than 20B --force destination_dir
.
- Deletes all information concerning file versions which have not been current for 2 weeks by running
- Statistics
- Lists increments in given golder by
rdiff-backup --list-increments destination_dir/
. - Lists of files changed in last 5 days by
rdiff-backup --list-changed-since 5D destination_dir/
. - Compare the difference between source and bak by
rdiff-backup --compare user@host::source-dir destination_dir
- Compare the sifference between source and bak (as it was two weeks ago) by
rdiff-backup --compare-at-time 2W user@host::source-dir destination_dir
.
- Lists increments in given golder by
3.A complete script (automatically sync using crontab
)
#!/bin/bash
export PYTHONPATH=${PYTHONPATH}:/soft/rdiff_backup/lib/python2.7/site-packages/
rdiff-backup --no-compression -v5 --exclude '**trash' user@server::source/ bak_dir/
ret=$?
if test $ret -ne 0; then
echo "Wrong in bak" | mutt -s "Wrong in bak" [email protected]
else
echo "Right in bak" | mutt -s "Right in bak" [email protected]
fi
echo "Finish rdiff-backup $0 ---`date`---" >>bak.log 2>&1
echo "`rdiff-backup --exclude '**trash' --compare-at-time 1D user@server::source/ bak_dir/`" | mutt -s "Lists of baked files" [email protected]
References
- rdiff-backup
- duplicity
- rsnapshot
- http://www.saltycrane.com/blog/2008/02/backup-on-linux-rsnapshot-vs-rdiff/
- http://james.lab6.com/2008/07/09/rdiff-backup-and-duplicity/
- http://bitflop.com/document/75
- http://askubuntu.com/questions/2596/comparison-of-backup-tools
- http://www.reddit.com/r/linux/comments/fgmbb/rdiffbackup_duplicity_or_rsnapshot_which_is/
- http://serverfault.com/questions/491341/optimize-space-rdiff-backup
- Another great post on usage of rdiff-backup